我正在对日期字段执行一个相当简单的计算,如果日期在预定义日期之前,我想返回 NULL 值。从本质上讲,我正在寻找使用相等运算符以外的运算符执行NULLIF
的最有效方法。
下面是我想做的事情的示例(显然语法失败):
SELECT
Id,
NULLIF(DATEADD(DAY, -180, SurveyDate),
{LESS THAN} '20190101')
FROM dbo.Vendor
我使用以下查询得到了所需的结果,但它似乎有点笨拙和冗长:
SELECT
Id,
CASE WHEN DATEADD(DAY, -180, SurveyDate) < '20190101'
THEN NULL
ELSE
DATEADD(DAY, -180, SurveyDate)
END
FROM dbo.Vendor
您可以做的简化是删除CASE
语句的ELSE
部分:
CASE WHEN DATEADD(DAY, -180, SurveyDate) >= '20190101' THEN DATEADD(DAY, -180, SurveyDate) END
我看不出如何在不给代码带来更多复杂性的情况下只调用函数DATEADD()
1 次。
您可以放置一个内联 IIF 语句。 让它不那么"笨重">
SELECT Id, IIF(DATEADD(DAY, -180, SurveyDate) < '20190101', NULL, DATEADD(DAY, -180, SurveyDate)) AS SurveyDate
FROM dbo.Vendor
首先,是时候升级数据库服务器了。
请注意,2008 和 2008 r2 版本的扩展支持于 2019 年 7 月 9 日结束 - 这意味着不再更新,甚至不会开发安全补丁(当然,即使在扩展支持结束后,Microsoft保留发布安全补丁的权利)。
有关详细信息,请阅读 RedGate 上的 SQL Server 2008 和 2008 R2 扩展支持的终结。
话虽如此,对于 2008 r2,您没有太多选择 - 大小写表达式可能是您唯一可行的选择。
但是,如果您不想两次编写dateadd
,则可以使用如下cross apply
:
SELECT
Id,
CASE WHEN TargetDate < '20190101'
THEN NULL
ELSE
TargetDate
END
FROM dbo.Vendor
CROSS APPLY
(
SELECT DATEADD(DAY, -180, SurveyDate) As TargetDate
) As td
在这种简单的情况下,这似乎有点矫枉过正,但是当您有一个复杂的表达式或多个计算列时,cross apply
就会派上用场。