Oracle BUILT-IN Functions LAST_DAY(), INTERVAL und TRUNC()

von Tobias Redmann

Praxisbeispiele – Oracle BUILT-IN Functions LAST_DAY(), INTERVAL und TRUNC()

Oft werde ich mit immer den gleichen Problemstellungen konfrontiert. Dazu zähle ich insbesonders den Umgang mit Datumswerten.
Viel zu häufig habe ich gesehen, wie ein DATE in ein VARCHAR2 umgewandelt wurde und dann die Monate, Jahre oder Tage manipuliert werden, um dieses dann im Anschluss wieder in ein DATE umzuwandeln.

Das ist nicht nur auf Datenbankseite kostenintensiv, sondern auch sehr fehleranfällig.

Ermittelt den letzten Tag eines Monats

Rechnet ein Jahr auf das aktuelle Datum

Rechnet 7 Monate auf das aktuelle Datum

Ermittelt den ersten Tag des nächsten Monats, ausgehend vom aktuellen Datum

Um die Uhrzeit eines DATEs auf „0 zu stellen“, kann die TRUNC Funktion verwendet werden.

6 KOMMENTARE

avatar placeholder
19
.
07
.
2016
 von  Stefan
Hallo, die angegebenen Lösungen sind leider auch durchaus fehleranfällig: select to_date('29022016' , 'DDMMYYYY') + interval '1' year from dual; select to_date('31012016' , 'DDMMYYYY') + interval '1' month from dual; liefern jeweils einen Fehler "ORA-01839: date not valid for month specified", weil stur das jeweils angegebene Feld inkrementiert wird, ohne Rücksicht auf das Ergebnis. Beim anschließenden "Zusammenbauen" knallt es beim ungültigen Datum (29.02.2017 resp. 31.02.2016). Gibt es in der aktuellen Oracle-Version inzwischen bessere Alternativen?
avatar placeholder
20
.
07
.
2016
 von  Karsten Besserdich
Hallo Stefan, ich würde an deiner Stelle eine Funktion schreiben, welche prüft ob deine Zeichenkette ein gültiges Datum ist. Gruß Karsten
avatar placeholder
29
.
10
.
2018
 von  Peter
Hallo, hat jmd. einen Tipp für die Syntax für den ersten Tag des aktuellen Monats? Ich habe Folgendes eingegeben und das funktioniert nicht. trunc(first_day(sysdate,'MM') VG Peter
avatar placeholder
18
.
10
.
2019
 von  Reza
Hallo Peter, Versuch es mit trunc(last_day(sysdate - interval '1' month)+1)
avatar placeholder
29
.
04
.
2020
 von  Markus
Hallo, "add_months()" ist auch manchmal ganz hilfreich. Das Problem von Stefan lässt sich mit: select add_months(to_date('29022016' , 'DDMMYYYY'), 12) year from dual; bzw. select add_months(to_date('31012016' , 'DDMMYYYY'), 1) year from dual; lösen. In beiden Fällen kommt nicht ORA-01839, sondern ein gültiges Datum. 28.02.2017 im ersten Fall, 29.02.2016 in zweiten Fall.
avatar placeholder
15
.
10
.
2020
 von  Tom
erster Tag des aktuellen Monats: select trunc(sysdate, 'MM') from dual

SCHREIBEN SIE EINEN KOMMENTAR