6

我必须比较 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
4

5 回答 5

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 
于 2012-05-09T18:33:39.937 回答
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)

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

于 2012-05-09T18:35:31.433 回答
0

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

Microsoft 的 ISNULL() 函数用于指定我们希望如何处理 NULL 值。

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

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

SQL Server/MS 访问

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

SQL 空函数

于 2012-05-09T18:35:00.403 回答
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);
于 2012-05-09T18:35:02.183 回答
0

我个人使用这个:

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)
于 2018-08-29T17:18:39.247 回答