【发布时间】:2016-08-05 17:44:39
【问题描述】:
来自DATEADD 文档:
如果 datepart 是月份并且日期月份的天数比返回的天数多 返回月份中不存在月份和日期日期,最后一个 返回返回月份的日期。例如,九月有 30 天;因此,以下两个语句返回 2006-09-30 00:00:00.000:
SELECT DATEADD(月, 1, '2006-08-30');
SELECT DATEADD(月, 1, '2006-08-31');
SQL Server 知道2016-03 的最后一天是31,2016-04 的最后一天是30:
SELECT DAY(EOMONTH('2016-03-01')) -- 31
SELECT DAY(EOMONTH('2016-04-01')) -- 30
那么为什么会这样:
SELECT DATEADD(MONTH, -1, '2016-04-30')
返回2016-03-30 00:00:00.000 而不是2016-03-31 00:00:00.000?
另外,如果我有以下情况:
SELECT DATEADD(MONTH, -1, '2016-03-31')
它正确返回2016-02-29 00:00:00.000。
【问题讨论】:
-
答案就在你的问题本身:)
-
..."并且返回月份中不存在日期日期"... - 由于 3 月确实存在第 30 天,因此它正确返回了 3 月 30 日
-
如果 EOMONTH 功能对您来说还不够,并且您想'坚持某种 DATEADD 类型的方法,您可以使用类似
SELECT DATEADD(MM, DATEDIFF(MM, -1, GETDATE()), 0) - 1 LastDayOfMonth -
如果您总是需要一个月的最后一天,请始终以 a 月的 31 日为起点。就这么简单。 (或者,计算下个月的第一天,并使用
<而不是<=)
标签: sql-server tsql sql-server-2014 dateadd