2012-05-09 5 views
4

2つの別々の列を比較して、それらの間の最新の日付を提示する必要があります。私はそれらを比較するためにDATEDIFF(分、日付1、日付2)を使用していますが、日付によってはNULLが返され、CASEが壊れてしまうレコードもあります。DATEDIFFの比較でNULLをどのように処理しますか?

これを回避する方法や、どちらの日付が前にNULLであるかを事前に特定する方法はありますか?

(psudocode)

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date 
        ELSE d.date2 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 
+2

2つの日付を単に比較するのではなく、なぜdatediffを使用するのですか?余分な処理時間を必要としませんか? – therealmitchconnors

+0

あなたは新しいユーザーであるので、役に立つと思ったら回答を受け入れるべきです。回答者には時間の無駄ではないという印象を与えるからです。いくつかの時間新しいユーザーが質問し、それを残す。 – jams

答えて

3

あなたは自分のケースに余分なロジックを追加することができます。

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE 
        WHEN d.date1 IS NULL THEN -- somewhat 
        WHEN d.date2 IS NULL THEN -- somewhat 
        WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date 
        ELSE d.date2 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 
0

あなたは、いくつかは、このように考えてみることができます。 Is Nullを使用してnullをチェックできます。

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE Case When date2 Is Null Then GetDate() 
        Case When date1 Is Null Then GetDate() 
        WHEN DATEDIFF(minute,d.date1,d.date2) <= 0 THEN d.date 
        ELSE d.date2 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 

MicrosoftのISNULL()関数は、私たちが NULL値をどのように処理するかを指定するために使用されます。

この場合、NULL値をゼロにします。以下は

、 "UnitsOnOrderは" 値がNULLの場合ISNULL()はゼロを返しますので、それが計算、 に害を与えないNULLの場合:

SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products 

のSQL Server/MS Accessの

SQL NULL Functions

0

これは最小限の処理で必要なものを提供します。

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE WHEN COALESCE(date1, date2)>COALESCE(date2, date1) 
        THEN COALESCE(date1, date2) 
        ELSE COALESCE(date2, date1) 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 
WHERE NOT (date1 is null and date2 is null); 
+0

ありがとう、それはNULLがそれを持っているようです。 DATEDIFF(分、ISNULL(日付1、0)、ISNULL(日付2、0))> = 1を使用して巻き上げましたdate2 ELSE date1 – user1385330

0

私はISNULLを使用します。

UPDATE TABLE 
SET NAME = p.name, 
    NEW_DATE = CASE WHEN ISNULL(DATEDIFF(minute,d.date1,d.date2), 0) <= 0 THEN d.date 
        ELSE d.date2 
       END 
FROM TABLE2 d 
INNER JOIN TABLE3 p 
    ON d.ACCTNUM = p.ACCTNUM 

または多分

ISNULL(DATEDIFF(minute,d.date1,d.date2), 1) 

あなたの周りにnull値に他の方法を処理したい場合。

関連する問題