【问题标题】:T-SQL DATEDIFF MONTH JanuaryT-SQL DATEDIFF 月 一月
【发布时间】:2016-12-05 21:01:39
【问题描述】:

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

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

【问题讨论】:

  • @JohnCappelletti - 简短的回答; 否。 (请参阅下面的两个答案。)
  • 试试看怎么样? declare @MyDate as Date = '20160115'; select @MyDate, DateName( Month, DateDiff( Month, -1, @MyDate ) );。你可以调整日期,看看你会得到什么。
  • @MatBailie Holy 抽烟!
  • @MatBailie 我现在明白了,他正在使用 dateDIFF。这是我小脑袋里的 dateADD。

标签: sql-server tsql datediff


【解决方案1】:

您错误地使用了这两个功能。我建议您查看在线帮助以了解更多详细信息,但这里是对您所做操作的说明...


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

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


因此,当您提供 -1 作为第一个日期时,它隐式地将 CAST 提供给 DATETIME

  • 碰巧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() ) )

【讨论】:

  • 感谢详细的解释!现在我了解了 DATEADD 和 DATEDIFF 之间的区别。我将改为实现 DATEADD。非常感谢。
【解决方案2】:

正如所写,没有。截至目前,它只会返回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'));

十二月

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 2015-02-10
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2017-02-09
    相关资源
    最近更新 更多