SQL Server CASE,当ELSE STATEMENT不能正常工作时

时间:2016-08-15 15:04:17

标签: sql sql-server case-when

我正在努力解决为什么以下案例陈述不起作用。

我想要做的是将月份从日期(&#34;死亡日期&#34;)转换为两个字符,以便1月变为01,2月变为02,10月到12月保持为两个字符长度< / p>

然而,代码似乎在困扰我

SELECT  
    LEN(MONT(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH)) AS length_of_month,
    (CASE
        WHEN LEN(MONTH(CAST(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH as VARCHAR(20)))) = 1
           THEN CONCAT('0', MONTH(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH))
     END) AS DERIVED_MOD
FROM    
    RAW.dbo.ONS_Death_DOD201516FYQ1

以上工作并将1位数转换为2但当我尝试实现下面的第二个选项时,它似乎不起作用。

SELECT  
    LEN(MONTH(ONS.DATE_OF_DEATH)) as length_of_month,
    (CASE
        WHEN LEN(MONTH(CAST(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH as VARCHAR(20)))) = 2
            THEN MONTH(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH)
        WHEN LEN(MONTH(CAST(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH as VARCHAR(20)))) = 1
            THEN CONCAT('0', MONTH(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH))
    END) AS DERIVED_MOD
FROM    
    RAW.dbo.ONS_Death_DOD201516FYQ1

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

要获得两位数的月份,只需填零,如下所示:

RIGHT('0' + RTRIM(MONTH(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH)), 2)

无需CASE WHEN

RTRIM就是将月份数转换为字符串。

如果您的版本是SQL Server 2012或更高版本,那么使用format的方式会更短:

FORMAT(RAW.dbo.ONS_Death_DOD201516FYQ1.DATE_OF_DEATH, 'MM') 

答案 1 :(得分:0)

  

我想要做的是将月份从日期(&#34;死亡日期&#34;)转换为两个字符   所以1月变成01,   2月变为02,10月到12月仍然是两个字符长度

将@dt替换为您的日期时间字段..来自SQLserver 2005

Declare @dt datetime
set @dt='20160901'
select
case when month(@dt)>=10 then cast( month(@dt) as varchar(2))
     else cast(0 as varchar(2))+cast(month(@dt) as varchar(2))
     end
     ,month(@dt)