当我在查询
下面执行时DECLARE @I INT=1
while(@I<13)
BEGIN
PRINT DATENAME(MONTH,@I)
PRINT @I
SET @I=@I+1
END
我的输出如下:
January
1
January
2
January
3
January
4
January
5
January
6
January
7
January
8
January
9
January
10
January
11
January
12
为什么所有月份名称都没有在上面的结果中打印?任何人都可以指明原因吗?
答案 0 :(得分:5)
因为当你使用DATENAME(MONTH,@I)
时
值1,2,3,4 ...隐式转换为DATETIME
:
SELECT CAST(1 AS DATETIME)
-- 1900-01-02 00:00:00
1 - Jan 2 1900 12:00AM
2 - Jan 3 1900 12:00AM
3 - Jan 4 1900 12:00AM
...
12 - Jan 13 1900 12:00AM
月份部分的和DATENAME
始终为January
您可以使用DATEADD
获取所有月份:
DECLARE @I INT=1
while(@I<13)
BEGIN
PRINT DATENAME(MONTH, DATEADD(MONTH, @i-1, '2000-01-01'))
PRINT @I
SET @I=@I+1
END
的 LiveDemo
强>
答案 1 :(得分:1)
要使DATENAME工作,第二个参数需要是日期而不是数字。使用int
会自动将此号码转换为1900年1月1日开始的一天(@I = 0
):
SELECT CONVERT(DATETIME, 0) -- returns 1900-01-01 00:00:00.000
SELECT CONVERT(DATETIME, 1) -- returns 1900-01-02 00:00:00.000
因此,对于@I
(当然还有很多其他整数值),0月30日的值将始终为1月。
答案 2 :(得分:0)
当您拥有月份数时,这是获取月份名称的最佳方式
DECLARE @I INT=1
while(@I<13)
BEGIN
print DateName( month , DateAdd( month , @i , -1 ) )
PRINT @I
SET @I=@I+1
END