Oracle BUILT-IN Functions LAST_DAY(), INTERVAL und TRUNC()
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
1 2 3 |
Select last_day(sysdate) AS "LETZTER TAG DES AKT.MONATS" from dual; |
Rechnet ein Jahr auf das aktuelle Datum
1 2 3 |
Select sysdate + Interval '1' year AS "SYSDATE + 1 JAHR" from dual; |
Rechnet 7 Monate auf das aktuelle Datum
1 2 3 |
Select sysdate + Interval '7' month AS "SYSDATE + 7 Monate" from dual; |
Ermittelt den ersten Tag des nächsten Monats, ausgehend vom aktuellen Datum
1 2 3 |
Select last_day(sysdate) + INTERVAL '1' DAY from dual; |
Um die Uhrzeit eines DATEs auf „0 zu stellen“, kann die TRUNC Funktion verwendet werden.
1 2 3 4 5 6 |
Select TRUNC ( last_day(sysdate) + INTERVAL '1' DAY ) from dual; |
6 KOMMENTARE

19
.
07
.
2016
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?

20
.
07
.
2016
Hallo Stefan,
ich würde an deiner Stelle eine Funktion schreiben, welche prüft ob deine Zeichenkette ein gültiges Datum ist.
Gruß Karsten

29
.
10
.
2018
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

18
.
10
.
2019
Hallo Peter,
Versuch es mit
trunc(last_day(sysdate - interval '1' month)+1)

29
.
04
.
2020
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.

15
.
10
.
2020
erster Tag des aktuellen Monats:
select trunc(sysdate, 'MM') from dual