SQL 服务器 CASE WHEN ELSE STATEMENT 没有正常工作

SQL Server CASE WHEN ELSE STATEMENT not working as should

我正在纠结为什么下面的 case 语句不起作用。

我想做的是将月份从日期 ("date of death") 转换为两个字符,这样一月变成 01,二月变成 02,十月到十二月保持两个字符的长度

然而,代码似乎难倒了我

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

非常感谢任何帮助。

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

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') 

What I want to do is convert the month from a date ("date of death") into two characters so that January becomes 01, February becomes 02 and October to December remain as their two character lengths

将@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)