T-SQL DATEDIFF MONTH 一月

T-SQL DATEDIFF MONTH January

这似乎是一个非常 simple/silly 的问题,但是,如果我在 1 月使用此代码,输出会是 12 月(如 1 月 - 1 = 12 月)吗?

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

正如所写,没有。截至目前,它只会 return November。这是因为您使用的是 DATEDIFF 而不是 DATEADD.

您可以通过选择 DATEDIFF 部分了解它为什么这样做:

SELECT  DATEDIFF(MONTH, -1, '2017-01-01')

1405

Select DateName(Month, 1405) returns November.

但是,这应该是您想要使用的:

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

是的,使用它会 return December:

SELECT  DATENAME(MONTH, DATEADD(MONTH, -1, '2017-01-01'));

December

您对这两个功能的使用不正确。我建议查看联机帮助以获取更多详细信息,但这里是对您所做操作的解释...


DATEDIFF()的最后两个参数都是DATETIMEs.

  • 它找出这两个日期之间的差异。
  • 以年、月、日、小时等为单位


因此,当您提供 -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.

  • 它returns那个日期的月份名称
  • 或星期几等


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

  • 那是 1st Jan 1970
  • 之后的 1405 天
  • 也就是6th Nov 1973
  • 所以DATENAME()returns'November'


您可能只是想从某个特定日期中抽出一个月,然后得到它的名字。

  • DATENAME( MONTH, DATEADD( MONTH, -1, getDate() ) )