SQL Server前导零

时间:2018-04-18 18:27:55

标签: sql-server tsql

我需要将所有月份转换为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语句中包含失败。

请帮忙!

4 个答案:

答案 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