为什么所有月份都不打印?

时间:2015-12-22 10:12:38

标签: sql sql-server sql-server-2008 tsql

当我在查询

下面执行时
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

为什么所有月份名称都没有在上面的结果中打印?任何人都可以指明原因吗?

3 个答案:

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

See Demo Here