Из документации DATEADD:
Если datepart имеет значение month, а в месяце даты больше дней, чем в месяце возврата, и день даты не существует в месяце возврата, возвращается последний день месяца возврата. Например, в сентябре 30 дней; поэтому два следующих оператора возвращают 2006-09-30 00: 00: 00.000:
ВЫБЕРИТЕ ДОБАВЛЕНИЕ ДАТЫ (месяц, 1, '2006-08-30');
ВЫБЕРИТЕ ДОБАВЛЕНИЕ ДАТЫ (месяц, 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
.
SELECT DATEADD(MM, DATEDIFF(MM, -1, GETDATE()), 0) - 1 LastDayOfMonth
- person pastacool   schedule 14.04.2016<
, а не<=
) - person Damien_The_Unbeliever   schedule 14.04.2016