Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

Wann ist +1 Monat?

30. September 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

In T-SQL des Microsoft SQL Servers gibt es die Funktion DATEADD, um auf ein Datum ein Intervall-Wert auf bzw. abzurechnen; sein es Tage, Wochen, Monate oder Ein Wert im Datumsbereich.

Einen Tag aufzurechnen, das ist klar und eindeutig: Aus Montag wird Dienstag und wie selbstverständlich wird aus dem 28.02.2009 der 01.03.2009 und nicht der 29.02, da es ja kein Schaltjahr ist.

Doch wie sieht es aus, wenn man einen Monat aufaddiert? Im Bankwesen ist er rechnerisch immer 30 Tage lang, im realen Leben variiert er aber. Wenn ich auf den 31.03. einen Monat rechne, kommt der 30.04. oder der 01.04. raus? Vom 30.04 ausgehend, erhalte ich den 30.05. oder den 31.05, weil es wie das Ausgangsdatum das Monatsende ist?

Bevor ich spekuliere, probiere ich es aus und das diesmal mit dem MS SQL 2008 mit der Möglichkeit der Multiple-Values.

 

T-SQL Statement:

 -- Wann ist +1 Monat? 
 SELECT * 
  ,DATEDIFF(dd, ThisDate, NextMonth) AS DayDiff 
 FROM  
  (SELECT ThisDate 
  ,DATEADD(mm, 1, ThisDate) AS NextMonth 
  FROM 
  (VALUES(CONVERT(date, '20081231')) 
  ,('20090131') ,('20090228') 
  ,('20090331') ,('20090430') 
  ,('20090531') ,('20090630') 
  ,('20090731')  
  ,('20090831') ,('20090930') 
  ,('20091031'), ('20091130') 
  ,('20091231')  
  ) AS Dates (ThisDate) 
  ) AS Dates 

 

Ergebnis: 

 ThisDate NextMonth DayDiff 
 ---------- ---------- ------- 
 2008-12-31 2009-01-31 31 
 2009-01-31 2009-02-28 28 
 2009-02-28 2009-03-28 28 
 2009-03-31 2009-04-30 30 
 2009-04-30 2009-05-30 30 
 2009-05-31 2009-06-30 30 
 2009-06-30 2009-07-30 30 
 2009-07-31 2009-08-31 31 
 2009-08-31 2009-09-30 30 
 2009-09-30 2009-10-30 30 
 2009-10-31 2009-11-30 30 
 2009-11-30 2009-12-30 30 
 2009-12-31 2010-01-31 31 

 

Das Ergebnis ist nicht gerade „deterministisch“: Grundsätzlich wird platt der Monat um eins hoch gezählt und wenn es ein ungültiges Datum ergibt, soweit tageweise zurück gerechnet, bis es gültig ist.

Ist halt so und sollte man immer im Hinterkopf behalten, wenn es um Auswertungen und ähnliches geht, um nicht falsche Zahlen zu erhalten.

Also: Um vom Monatsende auf das Monatsende des Folgemonats zu kommen, ist diese Methode ungeeignet. Besser man rechnet:

+ 1 Tag            (=Monatsanfang Folgemonat)

+ 1 Monat         (=Monatsanfang Übernächster Monat)

– 1 Tage           (=Monatsende Folgemonat)

 

=>

 

 SELECT DATEADD(DD, -1 
  ,DATEADD(MM, 1 
  ,DATEADD(DD, 1 
  ,'20090228' 
  ))) AS FolgeMonatsEnde 

Diesen Post teilen

Repost 0

Kommentiere diesen Post

Free SMS 10/06/2009 17:42


hey vielen dank danach hab ich gesucht .:)

mfg alex


Olaf Helper 10/06/2009 19:13


Immer gerne doch.