SQL Server前导零

Oda*_*lim 1 t-sql sql-server

我需要将所有月份转换为2位数字,如下所示:

1,2,3,4,5,6,7,8,9,10,11,12
Run Code Online (Sandbox Code Playgroud)

对此:

01,02,03,04,05,06,07,08,09,10,11,12
Run Code Online (Sandbox Code Playgroud)

所以我把一个简单的CASE语句放在一起检查月份的长度值是否为1,然后添加一个前导零,否则保持原样:

SELECT 
    CASE 
       WHEN LEN(MONTH(GETDATE())) = 1 
          THEN RIGHT('0' + CONVERT(VARCHAR(2), MONTH(GETDATE())), 2) 
          ELSE MONTH(GETDATE()) 
    END
Run Code Online (Sandbox Code Playgroud)

我们在四月,这次行动的结果是'4',而不是'04'.检查语句时(没有条件语句):

right('0' + convert(varchar(2),month(getdate())),2)
Run Code Online (Sandbox Code Playgroud)

然后我得到正确的答案('04')....

这让我大吃一惊..我已经在这一整天了,我无法弄清楚为什么代码单独工作,但是在CASE语句中包含失败.

请帮忙!

scs*_*mon 6

因为case语句必须返回相同的数据类型,而else是默认的INT.这是优先顺序.在这里,您将获得隐式转换.施放ELSE会解决这个问题.

,CASE 
    WHEN len(month(getdate())) = 1 
        THEN right('0' + convert(varchar(2),month(getdate())),2) 
    ELSE 
        cast(month(getdate()) as varchar(2)) END
Run Code Online (Sandbox Code Playgroud)

  • 实际上由于数据类型优先级而被转换为int,而不是varchar. (4认同)