首页 > 解决方案 > 我的case when 声明有什么问题?

问题描述

背景总结:我有一个日期字段叫做有效日期,格式是 YYYY-MM-DD。我正在创建一个名为 Acct_Dt 的新日期列,格式为 MM-YY。为了了解结果应该是什么,如果我的生效日期是 2019-02-20。如果该日期的月份和日期介于 2019 年 2 月 16 日和 2019 年 3 月 15 日之间,则意味着新的 Acct_Dt 将为 03-01。将旧日期格式与仅 MM 的新日期格式匹配-DD 我正在使用 Right 函数来获取月份和日期。

如果我的生效日期是 2019-06-15。如果该日期的月份和日期介于 2019-05-16 和 2019-06-15 之间,则意味着新的 Acct_Dt 将为 06-01。

我正在尝试编写一个嵌套的 Case when 语句来为一年中的所有月份执行此操作(不包括 2019-12-16 到 2020-01-15 的过渡。我没有为此编写逻辑)。

下面的代码:

Select PolicyNumber
,EffectiveDate
,Case When Right(EffectiveDate,5) BETWEEN '01-16' and '02-15' Then Acct_Dt = '-02-01' 
      When Right(EffectiveDate,5) BETWEEN '02-16' and '03-15' Then Acct_Dt = '-03-01'
      When Right(EffectiveDate,5) BETWEEN '03-16' and '04-15' Then Acct_Dt = '-04-01'
      When Right(EffectiveDate,5) BETWEEN '04-16' and '05-15' Then Acct_Dt = '-05-01'
      When Right(EffectiveDate,5) BETWEEN '05-16' and '06-15' Then Acct_Dt = '-06-01'
      When Right(EffectiveDate,5) BETWEEN '06-16' and '07-15' Then Acct_Dt = '-07-01'
      When Right(EffectiveDate,5) BETWEEN '07-16' and '08-15' Then Acct_Dt = '-08-01'
      When Right(EffectiveDate,5) BETWEEN '08-16' and '09-15' Then Acct_Dt = '-09-01'
      When Right(EffectiveDate,5) BETWEEN '09-16' and '10-15' Then Acct_Dt = '-10-01'
      When Right(EffectiveDate,5) BETWEEN '10-16' and '11-15' Then Acct_Dt = '-11-01'
      Else null
    End
FROM dbo.Combined_SS_RateMonitor
ORDER BY Policy_Number

标签: sqlsql-serversyntax-errorcase-when

解决方案


为什么要在列上使用字符串逻辑date

select (case when day(EffectiveDate) <= 15
             then dateadd(day, 1 - day(EffectiveDate), EffectiveDate)
             else dateadd(day, 1, eomonth(EffectiveDate))
        end) 

推荐阅读