使用Datediff计算列规范公式计算具有等效字符串值的天数

时间:2014-11-20 02:20:55

标签: sql-server sql-server-2008 datediff calculated-columns date-difference

我正在使用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的公式时出错。”你能告诉我如何使这个配方工作或者可能是另一种解决方案吗?

2 个答案:

答案 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