News zu Oracle

DBA Tipp: ORA-01839 und die Her­aus­for­de­run­gen mit dem Schaltjahr

Ein Schalt­jahr, eine Zeit, in der die Uhren anders ticken, die Ka­len­der­blät­ter eine zu­sätz­li­che Zeile bekommen und die Natur sich an einen be­son­de­ren Rhythmus an­schmiegt. Doch hinter diesem fas­zi­nie­ren­den Phänomen verbirgt sich eine komplexe ma­the­ma­ti­sche Regelung, die unsere digitalen Systeme her­aus­for­dern kann. 

Was hat der ORA-01839 mit dem Schalt­jahr zu tun?

Der ORA-01839 Fehler, benannt nach seinem Code in der Oracle-Datenbank, tritt auf, wenn ein Datum außerhalb des gültigen Bereichs liegt, der nor­ma­ler­wei­se zwischen dem 1. Januar 4712 v. Chr. und dem 31. Dezember 9999 n. Chr. liegt. Der 29. Februar, als seltener Gast im Kalender, kann zu un­vor­her­ge­se­he­nen Kom­pli­ka­tio­nen führen, wenn nicht an­ge­mes­sen darauf geachtet wird. So sind zum Beispiel diverse SQL-Interval-Funk­tio­nen für Da­tums­be­rech­nun­gen im Monats- und Jah­res­be­reich nicht schalt­jah­res­si­cher. Addiert oder sub­tra­hiert man mithilfe dieser Funk­tio­nen zum/vom 29. Februar einen Wert, der nicht ein Viel­fa­ches von vier Jahren oder 48 Monaten ist, erhält man einen

ORA-01839: date not valid for month specified

Das betrifft min­des­tens folgende SQL-Funktionen:

  • NUMTOYMINTERVAL
  • TO_YMINTERVAL
  • INTERVAL
SQL> select to_date('29-FEB-24')+numtoyminterval(1,'year') from dual;
select to_date('29-FEB-24')+numtoyminterval(1,'year') from dual
          	*
ERROR at line 1:
ORA-01839: date not valid for month specified
SQL> select to_date('29-FEB-24')+to_yminterval('1-0') from dual;
select to_date('29-FEB-24')+to_yminterval('1-0') from dual
          	*
ERROR at line 1:
ORA-01839: date not valid for month specified
SQL> select to_date('29-FEB-24')+interval '1' year from dual;
select to_date('29-FEB-24')+interval '1' year from dual
          	*
ERROR at line 1:
ORA-01839: date not valid for month specified

Was kannst du tun, um für das nächste Schalt­jahr gerüstet zu sein?

Wir empfehlen dringend, den Pro­gramm­code zu gegebener Zeit auf die Ver­wen­dung dieser Funk­tio­nen hin zu über­prü­fen und sie durch die add_months-Funktion zu ersetzen, die hin­sicht­lich Schalt­jah­res­be­rech­nung offenbar sauber im­ple­men­tiert wurde: 
SQL> select add_months(to_date('29-FEB-24'),12) from dual;

ADD_MONTH
---------
28-FEB-25

SQL> select add_months(to_date('29-FEB-24'),-12) from dual;

ADD_MONTH
---------
28-FEB-23
Das nächste Schalt­jahr kommt bestimmt! Wir sind gern für dich da, wenn du Fragen hast oder Hilfe dabei benötigst, deine Applikation(en) im Hinblick auf 2028 nochmal unter die Lupe zu nehmen. 

An alle, die bereits schon sehr weit im Voraus planen:

Wusstest du, dass das Schalt­jahr nicht zwingend alle vier Jahre statt­fin­den muss? Es gibt eine Ausnahme: Wenn sich eine Jah­res­zahl durch 100 teilen lässt, handelt es sich nicht um ein Schalt­jahr – außer es lässt sich auch durch 400 teilen. Aus diesem Grund war das Jahr 1900 kein Schalt­jahr, das Jahr 2000 hingegen schon. 2100, 2200 und 2300 werden wieder keine Schalt­jah­re sein. 

Hier findest du weitere DBA Tipps und Infos aus der Welt von Oracle aus unserem News & Insights Bereich.

icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email