Из DATEADD документации:DATEADD проблема, когда отрицательное число используется с МЕСЯЦА DATEPART
Если DatePart в месяц и дата месяц имеет больше дней, чем возвращение месяц и дата день не существует в обратном месяц, последний возвращается день возврата. Например, сентябрь имеет 30 дней; поэтому возвращаются следующие два отчета 2006-09-30 00: 00: 00.000:
ВЫБЕРИТЕ ДАТАДД (месяц, 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
.
Ответ есть в вашем самом вопросе :) –
... «и день не существует в месяц возвращения» ... - поскольку 30-й день существует в марте, он правильно возвращает 30-е марта – pastacool
, если функции EOMONTH недостаточно для вас, и вы хотите «придерживаться некоторого подхода DATEADD, вы можете использовать что-то вроде« SELECT DATEADD »(MM, DATEDIFF (MM, -1, GETDATE()), 0) - 1 LastDayOfMonth' – pastacool