我需要将所有月份转换为2位数字,如下所示:
1,2,3,4,5,6,7,8,9,10,11,12
到此:
01,02,03,04,05,06,07,08,09,10,11,12
所以我把一个简单的CASE语句放在一起检查月份的长度值是否为1,然后加上一个前导零,否则保持原样:
SELECT
CASE
WHEN LEN(MONTH(GETDATE())) = 1
THEN RIGHT('0' + CONVERT(VARCHAR(2), MONTH(GETDATE())), 2)
ELSE MONTH(GETDATE())
END
我们是在四月份,此操作的结果是' 4'而不是' 04'。检查语句时(没有条件语句):
right('0' + convert(varchar(2),month(getdate())),2)
然后我得到正确答案(' 04')....
这让我大吃一惊..我已经在这一整天了,我无法弄清楚为什么代码单独起作用,但是在CASE语句中包含失败。
请帮忙!
答案 0 :(得分:6)
因为case语句必须返回相同的数据类型,而else默认为INT
。它是precedence的顺序。在这里,您将获得隐式转换。投射ELSE
会解决这个问题。
,CASE
WHEN len(month(getdate())) = 1
THEN right('0' + convert(varchar(2),month(getdate())),2)
ELSE
cast(month(getdate()) as varchar(2)) END
答案 1 :(得分:3)
您可以使用FORMAT:
来实现这一目标SELECT FORMAT(MONTH(GETDATE()), '00')
答案 2 :(得分:2)
您不需要案例陈述。以下适用于所有月份。
select right('0' + convert(varchar(2), month(getdate())), 2)
答案 3 :(得分:1)
将您的ELSE转换为varchar(2),它可以正常工作。
SELECT CASE WHEN len(month(getdate())) = 1
THEN right('0' + convert(varchar(2),month(getdate())),2)
else CONVERT(varchar(2), month(getdate()))
end