【问题标题】:How do you handle NULLs in a DATEDIFF comparison?在 DATEDIFF 比较中如何处理 NULL?
【发布时间】:2012-05-09 18:29:56
【问题描述】:

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

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

(伪代码)

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

【问题讨论】:

  • 为什么使用 datediff 而不是只比较两个日期?这不是需要额外的处理时间吗?
  • 由于您是 SO 的新用户,如果您觉得它有用,您应该接受它。因为它给回答者的印象是他们帮助你而不是浪费时间。有时新用户提出问题并离开。

标签: sql tsql datediff


【解决方案1】:

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

如果你想反过来处理空值。

【讨论】:

    【解决方案2】:

    您可以在 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 
    

    【讨论】:

      【解决方案3】:

      你可以尝试一些这样的想法。您可以使用Is 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
      

      微软的 ISNULL() 函数用于指定我们要如何对待 NULL 值。

      在这种情况下,我们希望 NULL 值为零。

      下面,如果 "UnitsOnOrder" 为 NULL 它不会损害计算, 因为如果值为 NULL,则 ISNULL() 返回零:

      SQL Server/MS 访问

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

      SQL NULL Functions

      【讨论】:

        【解决方案4】:

        这应该可以为您提供所需的最少处理。

        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);
        

        【讨论】:

        • 谢谢大家,好像NULL的都有了。我结束了使用 DATEDIFF(MINUTE, ISNULL(date1, 0), ISNULL(date2, 0)) >= 1 THEN date2 ELSE date1
        【解决方案5】:

        我个人使用这个:

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

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

        例子:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-18
          • 2012-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-20
          相关资源
          最近更新 更多