【问题标题】:DATEADD CalculationDATEADD 计算
【发布时间】:2014-08-31 10:04:50
【问题描述】:

如何在 DATEADD() 中为 MONTH 日期部分进行计算

添加月份

SELECT '2012-01-29' AS [Date], CAST(DATEADD(MONTH, 1, '2012-01-31') AS DATE) AS NextDate
UNION
SELECT '2012-01-31' AS [Date], CAST(DATEADD(MONTH, 1, '2012-01-31') AS DATE) AS NextDate
UNION
SELECT '2013-01-31' AS [Date], CAST(DATEADD(MONTH, 1, '2013-01-31') AS DATE) AS NextDate

结果

减去月份

SELECT '2012-02-29' AS [Date], CAST(DATEADD(MONTH, -1, '2012-02-29') AS DATE) AS PrevDate
UNION
SELECT '2012-03-01' AS [Date], CAST(DATEADD(MONTH, -1, '2012-03-01') AS DATE) AS PrevDate

结果

当我为日期 29,30,31 of Jan'2012 添加月份时,我得到与 February 29 相同的结果。对于减法,对于日期29 Feb'2012,它显示29 Jan'2012。无法获取日期30 & 31 of Jan'2012

我想知道一些简短的解释。

【问题讨论】:

    标签: sql sql-server date dateadd


    【解决方案1】:

    DATEADD 的文档中明确记录了该行为:

    DATEADD (datepart , number , date )
    

    ...

    如果 datepartmonth 并且 date 月份的天数比返回月份和 date 天多返回月份不存在,返回返回月份的最后一天。例如,九月有 30 天;因此,以下两个语句返回 2006-09-30 00:00:00.000:

    SELECT DATEADD(month, 1, '2006-08-30');
    
    SELECT DATEADD(month, 1, '2006-08-31');
    

    至于为什么它有这种行为,这一切都归结为这样一个事实,即可变长度的月份意味着您在执行日期数学时必须应用某种形式的权衡,并且没有一个“正确”的答案存在。您认为 1 月 31 日是“一月的最后一天”还是“一月 1 日之后的 30 天”。这两种方式都是正确的思考 31 日的方式。但是,如果您将January 更改为February,您现在将获得两个不同的日期——“2 月的最后一天”为 2 月 28 日或 29 日,“2 月 1 日之后的 30 天”为 3 月 2 日或 3 日。

    但函数必须只返回一个值。

    我并不是说 SQL Server 应用上述任何一种解释。但是,它的作用是确保如果您在特定日期上添加 1 个月,您可以确保生成的日期在下个月。

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      相关资源
      最近更新 更多