sql-server - 负数与 MONTH 日期部分一起使用时的 DATEADD 问题

标签 sql-server tsql sql-server-2014 dateadd

来自DATEADD文档:

If datepart is month and the date month has more days than the return month and the date day does not exist in the return month, the last day of the return month is returned. For example, September has 30 days; therefore, the two following statements return 2006-09-30 00:00:00.000:

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

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

SQL Server 知道 2016-03 的最后一天是 312016-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

最佳答案

正如其他评论所说,如果上个月存在该月的某天,DATEADD 将使用它,而不是假设您想要“该月的最后一天”。

如果您确实想要“本月的最后一天”,则必须增加一些逻辑,例如:

DECLARE @date DATETIME = '30 April 2016'
SELECT CASE WHEN DATEDIFF(MONTH, @date, DATEADD(DAY, 1, @date)) = 1 THEN     DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, @date), 0))
        ELSE DATEADD(MONTH, -1, @date)
   END

这将假设如果它是该月的最后一天,您需要上个月的最后一天,而不是明确的 28 日、29 日或 30 日。

关于sql-server - 负数与 MONTH 日期部分一起使用时的 DATEADD 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36618563/

相关文章:

sql - 我需要sql server中的一个函数来在输入字符串的每个位置插入一个空格

java - ERROR : java. sql.SQLSyntaxErrorException:您的 SQL 语法有错误;

sql-server - 规则已被弃用,取而代之的是什么呢(TSQL)?

sql - 使用SQL Server 2005的最佳分页解决方案?

sql-server - Sql Server 2014 - 更新到 Windows 10 并且无法连接到本地服务器

sql - 如何在 SQL 中添加序列/排序数据

sql - 针对记录保存自定义属性值的最佳数据库设计

sql - 动态表插入 SQL

SQL Server - 查询根据每年的最后值计算加权平均值

sql-server - 如何防止 Entity Framework 将属性设置为可为空?