0

我正在使用 SQL Server 2008,并在我的表上创建了一个计算列,即 ResidencyStatus。在 ResidencyStatus 中使用 datediff 我想知道当前日期(现在日期)和我的其他日期列 ResidencyDate 之间的差异。

  • 现在,如果结果小于或等于 183 天(小于或等于 6 个月),那么我想将字符串“Transient”放入 ResidencyStatus。

  • 如果结果大于或等于 184 天(大于或等于 6 个月零 1 天)且小于或等于 1825 天(小于或等于 4 年零 364 天),则该值将为 'Migrant '。

  • 如果结果大于或等于 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 的公式时出错。” 你能给我一个关于如何使这个公式起作用或替代解决方案的想法吗?

4

2 回答 2

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
  .....
  .....
于 2014-11-20T02:24:17.310 回答
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在这些情况下返回。

于 2014-11-20T02:27:24.823 回答