Von der DATEADD Dokumentation verwendet:DATEADD Problem, wenn negative Zahl wird mit MONAT Datumsteil
Wenn Datumsteil Monat und das Datum Monat hat mehr Tage als die Rendite Monat und das Datum Tag existiert nicht in der Rückkehr Monat, der letzte Tag des Rückkehrmonats zurückgegeben wird. Zum Beispiel hat September 30 Tage; daher geben die zwei folgenden Anweisungen zurück: 2006-09-30 00: 00: 00.000:
SELECT DATEADD (Monat, 1, '2006-08-30');
SELECT DATEADD (Monat, 1, '2006-08-31');
Der SQL Server
weiß, dass der letzte Tag des 2016-03
ist 31
und der letzte Tag des 2016-04
ist 30
:
SELECT DAY(EOMONTH('2016-03-01')) -- 31
SELECT DAY(EOMONTH('2016-04-01')) -- 30
Dann, warum die folgenden:
SELECT DATEADD(MONTH, -1, '2016-04-30')
kehrt 2016-03-30 00:00:00.000
statt 2016-03-31 00:00:00.000
?
Auch wenn ich folgendes:
SELECT DATEADD(MONTH, -1, '2016-03-31')
es richtig 2016-02-29 00:00:00.000
zurückgibt.
Antwort ist da in Ihrer Frage selbst :) –
... "und der Datumstag existiert nicht im Rückgabemonat" ... - da der 30. Tag im März existiert, gibt er den 30. März korrekt zurück – pastacool
Wenn die EOMONTH-Funktion nicht genug für Sie ist und Sie sich an einen DATEADD-Ansatz halten möchten, könnten Sie etwas wie SELECT DATEADD (MM, DATEDIFF (MM, -1, GETDATE()), 0) verwenden. 1 LastDayOfMonth' – pastacool