DATEADD()中月日期部分的计算方法
添加月份
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。
我想知道一些简短的解释。
发布于 2014-07-10 06:25:03
这种行为在DATEADD的文档中有明确的记录。
DATEADD (datepart , number , date )..。 如果datepart为月,且该日期月份的天数比返回月份多,且返回月份中不存在日期,则返回月份的最后一天将被返回。例如,9月有30天;因此,以下两个语句返回2006-09-3000:00:00.000:
SELECT DATEADD(month, 1, '2006-08-30');
SELECT DATEADD(month, 1, '2006-08-31');至于为什么它有这种行为,这一切归结于这样一个事实:变长的月份意味着在执行日期数学时必须采用某种形式的权衡,而且没有一个“正确”的答案存在。你认为1月31日是“1月的最后一天”还是“1月1日之后的30天”?这两种思考方式都是正确的。但是,如果您将January改为February,您现在将得到两个不同的日期:2月28日或29日,“2月的最后一天”,或3月2日或3日的“2月1日之后的30天”。
但是函数只能返回一个值。
我并不是说Server应用了上述任何一种解释。但是,它所做的是确保,如果将(比方说)一个月添加到特定日期,则可以确保产生的日期在下一个月内。
https://stackoverflow.com/questions/24669624
复制相似问题