我必须比较两个单独的列,以便得出它们之间的最新日期。我使用DATEDIFF(分钟,日期1,日期2)来比较它们,但是,在某些记录中,日期为空,返回空结果并混淆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
您可以在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
我会用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)
如果你想以相反的方式处理空值。
你可以试试这样的想法。你可以使用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
这应该为您提供所需的最少处理。
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这样的更复杂的数据类型,这实际上很有效。我也在寻找解决方案,很多人都问如何减去null date或者为什么simple 0000-00-00不起作用。当minuend或subtrahend为null时,IIF可以避免减法。
例:
IIF([ReturnDate] is null,
datediff(day,[BookDate],getdate())*CostPerDay,
datediff(day,[BookDate],[ReturnDate])*CostPerDay)