Sql 如何在DATEDIFF比较中处理空值?

Sql 如何在DATEDIFF比较中处理空值?,sql,tsql,datediff,Sql,Tsql,Datediff,我必须比较两个单独的栏目,才能得出它们之间的最新日期。我使用DATEDIFF(minute,date1,date2)来比较它们,但是,在一些记录中,日期为Null,这会返回Null结果,并将情况弄糟 有没有办法解决这个问题,或者预先确定哪个日期是空的 (psudocode) 更新表 SET NAME=p.NAME, NEW_DATE=DATEDIFF(minute,d.date1,d.date2)时的情况您只需在案例中添加额外的逻辑即可: UPDATE TABLE SET NAME = p.n

我必须比较两个单独的栏目,才能得出它们之间的最新日期。我使用DATEDIFF(minute,date1,date2)来比较它们,但是,在一些记录中,日期为Null,这会返回Null结果,并将情况弄糟

有没有办法解决这个问题,或者预先确定哪个日期是空的

(psudocode)

更新表
SET NAME=p.NAME,

NEW_DATE=DATEDIFF(minute,d.date1,d.date2)时的情况您只需在案例中添加额外的逻辑即可:

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 
更新表
SET NAME=p.NAME,
新日期=案例
当d.date1为NULL时,则
当d.date2为NULL时,则

当DATEDIFF(minute,d.date1,d.date2)时,您可以尝试这样的想法。您可以使用
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

这将以最少的处理量满足您的需求

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);
我会用


如果您想以另一种方式处理空值。

我个人使用:

IIF([yourvariable] is null, expression_when_true, expression_when_false)
如果您有更复杂的数据类型,如DATE,这实际上很有效。我也在寻找解决方案,很多人问如何减去空日期,或者为什么简单的0000-00-00不起作用。当minuted或subtrahand为null时,IIF可以避免减法

例如:

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

为什么要使用datediff而不是仅仅比较这两个日期?这难道不需要额外的处理时间吗?因为你是SO上的新用户,如果你觉得答案有用,你应该接受它。因为这给回答者的印象是,他们帮了你,而不是浪费时间。有时新用户会问一个问题,然后离开。谢谢大家,似乎空用户已经拥有了它。最后,我使用DATEDIFF(分钟,ISNULL(date1,0),ISNULL(date2,0))>=1,然后使用date2 ELSE date1
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)
IIF([yourvariable] is null, expression_when_true, expression_when_false)
IIF([ReturnDate] is null,
datediff(day,[BookDate],getdate())*CostPerDay,  
datediff(day,[BookDate],[ReturnDate])*CostPerDay)