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)
我正在纠结为什么下面的 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)