如何在DATEDIFF比较中处理NULL?

时间:2012-05-09 18:29:57

标签: sql tsql datediff

我必须比较两个单独的列才能得出它们之间的最新日期。我使用DATEDIFF(minute,date1,date2)来比较它们,但是,在某些记录中,日期为Null,返回null结果并混淆CASE。

有没有解决方法,或预先确定哪个日期为空?

(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

5 个答案:

答案 0 :(得分:3)

您可以在CASE中添加额外的逻辑:

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 

答案 1 :(得分: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,则不会损害计算,   因为如果值为NULL,ISNULL()返回零:

SQL Server / MS Access

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

SQL NULL Functions

答案 2 :(得分: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);

答案 3 :(得分: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)

如果你想以相反的方式处理空值。

答案 4 :(得分:0)

我个人使用此:

IIF([yourvariable] is null, expression_when_true, expression_when_false)

如果您具有更复杂的数据类型(例如DATE),则此方法实际上效果很好。我也一直在寻找解决方案,很多人问如何减去空日期或为什么简单的registers不起作用。如果minuend或subtrahend为null,则IIF可以避免减法。

示例:

IIF([ReturnDate] is null,
datediff(day,[BookDate],getdate())*CostPerDay,  
datediff(day,[BookDate],[ReturnDate])*CostPerDay)