这可能看起来像一个非常简单/愚蠢的问题但是,如果我在1月使用此代码,输出将是12月(如1月 - 1 = 12月)?
SELECT DATENAME(MONTH, DATEDIFF(MONTH, -1, GETDATE()));
答案 0 :(得分:2)
您错误地使用了这两种功能。我建议您查看在线帮助以获取更多详细信息,但这里是对您所做的事情的解释...
DATEDIFF()
的最后两个参数都是DATETIME
s。
因此,当您提供-1
作为第一个日期时,它隐含CAST
到DATETIME
。
0
为1970-Jan-01 @ 00:00:00
-1
为1969-Dec-31 @ 00:00:00
。 How many months are there between 1969-Dec-31 and now?
DATENAME()
的第二个参数也是DATETIME
。
因此,当您提供1405
作为DATETIME
参数时,也会隐式转换。
1st Jan 1970
6th Nov 1973
DATENAME()
会返回'November'
你可能只想在特定日期之后离开一个月,然后得到它的名字。
DATENAME( MONTH, DATEADD( MONTH, -1, getDate() ) )
答案 1 :(得分:1)
如上所述,没有。截至目前,它只会返回November
。这是因为您使用DATEDIFF
代替DATEADD
。
您可以通过选择DATEDIFF
部分来了解其原因:
SELECT DATEDIFF(MONTH, -1, '2017-01-01')
1405
而Select DateName(Month, 1405)
会返回November
。
但是,这应该是您的意思:
SELECT DATENAME(MONTH, DATEADD(MONTH, -1, GETDATE()));
是的,使用它会返回December
:
SELECT DATENAME(MONTH, DATEADD(MONTH, -1, '2017-01-01'));
腊