我正在对日期字段执行相当简单的计算,并且在日期早于预定义日期的情况下,我想返回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
答案 0 :(得分:2)
您可以做的一个简化就是删除ELSE
语句的CASE
部分:
CASE WHEN DATEADD(DAY, -180, SurveyDate) >= '20190101' THEN DATEADD(DAY, -180, SurveyDate) END
我看不到如何仅对函数DATEADD()
进行一次调用,而又不会给代码带来更多的复杂性。
答案 1 :(得分:0)
您可以插入内联IIF语句。使其不那么“笨拙”
SELECT Id, IIF(DATEADD(DAY, -180, SurveyDate) < '20190101', NULL, DATEADD(DAY, -180, SurveyDate)) AS SurveyDate
FROM dbo.Vendor
答案 2 :(得分:0)
首先,是时候升级数据库服务器了。
请注意,2008年和2008 r2版本的扩展支持已于2019年7月9日终止-这意味着将不再开发更新,甚至不会开发安全补丁(当然,即使扩展支持终止,Microsoft保留发布安全补丁的权利)。
有关更多信息,请阅读RedGate上的The End of SQL Server 2008 and 2008 R2 Extended Support。
话虽如此,但在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
就派上用场了。