首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DATEADD计算

DATEADD计算
EN

Stack Overflow用户
提问于 2014-07-10 06:15:27
回答 1查看 4.1K关注 0票数 1

DATEADD()中日期部分的计算方法

添加月份

代码语言:javascript
复制
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

结果

减月

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-10 06:25:03

这种行为在DATEADD的文档中有明确的记录。

代码语言:javascript
复制
DATEADD (datepart , number , date )

..。 如果datepart为,且该日期月份的天数比返回月份多,且返回月份中不存在日期,则返回月份的最后一天将被返回。例如,9月有30天;因此,以下两个语句返回2006-09-3000:00:00.000:

代码语言:javascript
复制
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应用了上述任何一种解释。但是,它所做的是确保,如果将(比方说)一个月添加到特定日期,则可以确保产生的日期在下一个月内。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24669624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档