DATEADD计算

时间:2014-07-10 06:15:27

标签: sql sql-server date dateadd

DATEADD()中 MONTH datepart的计算方式

添加月份

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

结果

enter image description here

减去月份

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

结果

enter image description here

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

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

1 个答案:

答案 0 :(得分:3)

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

DATEADD (datepart , number , date )
  

...

     

如果 datepart 日期月的天数多于退货月份和日期天在返回月份中不存在,返回月份的最后一天。例如,9月有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月的最后一天"或者"在1月1日和#34;之后30天。这两个都是正确的思考方式。但是,如果您将January更改为February,您现在可以获得两个不同的日期 - 2月28日或29日," 2月的最后一天和#34;或者在2月1日和#34之后30天的3月2日或3日。

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

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