我正在使用SQL Server 2008,我在我的桌子上创建了一个计算列,即ResidencyStatus。在ResidencyStatus中使用datediff我想知道当前日期(现在的日期)和我的其他日期列ResidencyDate之间的区别。
现在,如果结果小于或等于183天(小于或等于6个月),那么我想把字符串'Transient'放在ResidencyStatus中。
如果结果大于或等于184天(大于或等于6个月和1天)且小于或等于1825天(小于或等于4年和364天),则价值将是'移民'。
如果结果大于或等于1826天(大于或等于5年),那么该值将为“居民”。
我尝试在计算列中使用此公式:
(case when (datediff(day,[ResidencyDate],getdate()))<=183 then 'Transient' elseif (datediff(day,[ResidencyDate],getdate())>=184 and <=1825 then 'Migrant' elseif (datediff(day,[ResidencyDate],getdate())>=1826 then 'Resident' end
...但发生此错误“验证列ResidencyStatus的公式时出错。”你能告诉我如何使这个配方工作或者可能是另一种解决方案吗?
答案 0 :(得分:1)
试试这个。
select
....
CASE
WHEN ( Datediff(day, [ResidencyDate], Getdate()) ) <= 183 THEN 'Transient'
WHEN Datediff(day, [ResidencyDate], Getdate()) >= 184
AND Datediff(day, [ResidencyDate], Getdate()) <= 1825 THEN 'Migrant'
ELSE 'Resident'
END
.....
.....
或使用Between
select
....
CASE
WHEN ( Datediff(day, [ResidencyDate], Getdate()) ) <= 183 THEN 'Transient'
WHEN Datediff(day, [ResidencyDate], Getdate()) Between 184 and 1825 THEN 'Migrant'
ELSE 'Resident'
END
.....
.....
答案 1 :(得分:1)
elseif
语句中没有case
这样的内容。 case
语句采用一系列when
子句,并按顺序进行评估。所以,你可以表达你想要的东西:
(case when datediff(day, [ResidencyDate], getdate()) <= 183 then 'Transient'
when datediff(day, [ResidencyDate], getdate()) <= 1825 then 'Migrant'
else 'Resident'
end)
好的,这与你的逻辑略有不同。 else
将包含NULL
个值。这很容易解决:
(case when datediff(day, [ResidencyDate], getdate()) <= 183 then 'Transient'
when datediff(day, [ResidencyDate], getdate()) <= 1825 then 'Migrant'
when datediff(day, [ResidencyDate], getdate()) > 1825 then 'Resident'
end)
在这些情况下,这将返回NULL
。