T-SQL DATEDIFF月1月

时间:2016-12-05 21:01:39

标签: sql-server tsql datediff

这可能看起来像一个非常简单/愚蠢的问题但是,如果我在1月使用此代码,输出将是12月(如1月 - 1 = 12月)?

SELECT  DATENAME(MONTH, DATEDIFF(MONTH, -1, GETDATE()));

2 个答案:

答案 0 :(得分:2)

您错误地使用了这两种功能。我建议您查看在线帮助以获取更多详细信息,但这里是对您所做的事情的解释...


DATEDIFF()的最后两个参数都是DATETIME s。

  • 找出这两个日期之间的差异。
  • 在数年,数月,或数日,或数小时等。


因此,当您提供-1作为第一个日期时,它隐含CASTDATETIME

  • 碰巧,01970-Jan-01 @ 00:00:00
  • 这意味着-11969-Dec-31 @ 00:00:00
  • 您完成了 How many months are there between 1969-Dec-31 and now?
  • 当前1405个月


DATENAME()的第二个参数也是DATETIME

  • 返回该日期的月份名称
  • 或者日期等等。


因此,当您提供1405作为DATETIME参数时,也会隐式转换。

  • 1st Jan 1970
  • 之后的1405天
  • 哪个是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'));