1. Start
  2. Unternehmen
  3. Blog
  4. 26ai: Neue Kalenderfunktionen

26ai: Neue Kalenderfunktionen

Einleitung

Bisher gab es im Grunde nur die Funktionen TO_DATE, TO_CHAR, TRUNC und ADD_MONTHS um mit Datumsangaben zu hantieren. Das hat insbesondere das Arbeiten mit Quartalen recht schwierig gemacht, insbesondere wenn es um Geschäftsjahresquartale ging und das Geschäftsjahr nicht gerade zum 01.01. beginnt. Die Oracle Datenbank 26ai bringt dafür eine ganze Reihe neuer Kalenderfunktionen mit. Eine Übersicht dazu findet sich z.B. hier in der Dokumentation.

Im Grunde gibt es Funktionen zum Ermitteln verschiedener Datumswerte als Text, Datum und Zahl. Dazu kommen noch einige Funktionen um mit Datumswerten zu rechnen. Werfen wir mal einen Blick darauf.

Kalender-Funktionen

Beginnen wir mal mit ein paar Funktionen zum Ermitteln der aktuellen Werte als Text:

 

MARCO @ DB26AI:PDB1:>select
  2    calendar_year(date '2026-09-23') as jahr,
  3    calendar_quarter(date '2026-09-23') as quartal,
  4    calendar_month(date '2026-09-23') as monat,
  5    calendar_week(date '2026-09-23') as woche,
  6*   calendar_day(date '2026-09-23') as tag;

JAHR QUARTAL MONAT    WOCHE    TAG
---- ------- -------- -------- -----------
2026 Q3-2026 SEP-2026 W38-2026 23-SEP-2026

 

Man sieht, wir sind im 3. Quartal, es ist die Woche 38 im September im Jahr 2026. Bis auf das Quartal ist das soweit noch nichts Neues. Bemerkenswert ist hier nur, dass das Datumsformat für den Parameter fest und nicht abhängig von NLS_DATE_FORMAT ist. Das zeigt ein kurzer Quercheck:

 

MARCO @ DB26AI:PDB1:>select sysdate ;

SYSDATE
-------------------
23.09.2026 11:11:12

MARCO @ DB26AI:PDB1:>select calendar_year(date '23.09.2026') as jahr;

Error starting at line : 1 in command -
select calendar_year(date '23.09.2026') as year
Error at Command Line : 1 Column : 27
Error report -
SQL Error: ORA-01861: literal does not match format string
Help: docs.oracle.com/error-help/db/ora-01861/

 

Man sieht, es ist ein deutsches Datums- und Zeitformat eingestellt, das kommt aber für die Interpretation des Parameters nicht zur Anwendung.  

Weiter gehts mit Funktionen, um ein paar Datumswerte zu ermitteln. Hier wird die Sache schon deutlich spannender, weil wir jeweils Start und Ende eines Jahres, Monats, Quartals oder Woche ermitteln können. Dazu stellen wir ein gut lesbares Datumsformat ein.

 

MARCO @ DB26AI:PDB1:>alter session set nls_date_format='dd.mm.yyyy';

Session altered.

MARCO @ DB26AI:PDB1:>select
  2    calendar_year_start_date(date '2026-09-23') as jahr_beginn,
  3    calendar_year_end_date(date '2026-09-23') as jahr_ende,
  4    calendar_quarter_start_date(date '2026-09-23') as quartal_beginn,
  5    calendar_quarter_end_date(date '2026-09-23') as quartal_ende,
  6    calendar_month_start_date(date '2026-09-23') as monat_beginn,
  7    calendar_month_end_date(date '2026-09-23') as monat_ende,
  8    calendar_week_start_date(date '2026-09-23') as woche_beginn,
  9*   calendar_week_end_date(date '2026-09-23') as woche_ende;

JAHR_BEGIN JAHR_ENDE  QUARTAL_BE QUARTAL_EN MONAT_BEGI MONAT_ENDE WOCHE_BEGI WOCHE_ENDE
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
01.01.2026 31.12.2026 01.07.2026 30.09.2026 01.09.2026 30.09.2026 17.09.2026 23.09.2026

 

Die Funktionen sind soweit alle selbsterklärend. Gerade bei den Quartalen oder Ende-Daten musste bislang deutlich mehr gerechnet werden was die Ausdrücke teilweise schwer lesbar gemacht hat.

Analoge Funktionen gibt es noch, um Zahlenwerte zu ermitteln:

 

MARCO @ DB26AI:PDB1:>select
  2    calendar_year_number(date '2026-09-23') as jahr_nr,
  3    calendar_quarter_of_year(date '2026-09-23') as qurtal_nr,
  4    calendar_month_of_year(date '2026-09-23') as monat_nr,
  5    calendar_month_of_quarter(date '2026-09-23') as monat_im_quartal,
  6    calendar_week_of_year(date '2026-09-23') as woche_nr,
  7    calendar_day_of_year(date '2026-09-23') as tag_nr,
  8    calendar_day_of_quarter(date '2026-09-23') as tag_im_qurtal,
  9    calendar_day_of_month(date '2026-09-23') as tag_im_monat,
 10*   calendar_day_of_week(date '2026-09-23') as tag_in_woche;

   JAHR_NR  QURTAL_NR   MONAT_NR MONAT_IM_QUARTAL   WOCHE_NR     TAG_NR TAG_IM_QURTAL TAG_IM_MONAT TAG_IN_WOCHE
---------- ---------- ---------- ---------------- ---------- ---------- ------------- ------------ ------------
      2026          3          9                3         38        266            85           23            3

 

Hier müssen wir nur beachten, dass der Tag der Woche abhängig von NLS_TERRITORY ist. In manchen Regionen beginnt die Woche eben am Sonntag, anderswo am Montag. 

Weitere Funktionen existieren, um Intervalle zu einem Datum hinzufügen oder abzuziehen:

 

MARCO @ DB26AI:PDB1:>
  2  select
  3    calendar_add_years(date '2026-09-23', 2) as jahr,
  4    calendar_add_quarters(date '2026-09-23', 2) as quartal,
  5    calendar_add_months(date '2026-09-23', 3) as monat,
  6    calendar_add_weeks(date '2026-09-23', 10) as woche,
  7    calendar_add_days(date '2026-09-23', 90) as tag_plus,
  8*   calendar_add_days(date '2026-09-23', -30) as tag_minus;

JAHR       QUARTAL    MONAT      WOCHE      TAG_PLUS   TAG_MINUS
---------- ---------- ---------- ---------- ---------- ----------
23.09.2028 23.03.2027 23.12.2026 02.12.2026 22.12.2026 24.08.2026

 

Zum Abschluss noch eine Funktion zum Ermitteln von Intervallen als Textform. Der Text ist abhängig von der Größe des Intervalls, siehe Dokumentation. Mal sehen, wie lange ich schon bei Robotron bin:

 

MARCO @ DB26AI:PDB1:>select calendar_since (date '2009-01-01') years;

YEARS
----------------
17.7 years ago

 

Doch schon eine ganze Weile :)

Fiskaljahr-Funktionen

Richtig spannend wird es bei der Verarbeitung von Daten in einem Geschäftsjahr. Dazu definieren wir zuerst den Beginn des Geschäftsjahres, das von Robotron beginnt beispielsweise am 01.06., analog zu Oracle's Geschäftsjahr.

 

MARCO @ DB26AI:PDB1:>alter session set calendar_fiscal_year_start = '01.06.2026', 'dd.mm.yyyy';

Session altered.

 

Analog zu den oben gezeigten Kalender-Funktionen gibt es Funktionen für das Geschäftsjahr. Hier die Beispiele von oben, nur eben bezogen auf das Robotron-Geschäftsjahr:

 

MARCO @ DB26AI:PDB1:>select
  2    fiscal_year(date '2026-09-23') as jahr,
  3    fiscal_quarter(date '2026-09-23') as quartal,
  4    fiscal_month(date '2026-09-23') as monat,
  5    fiscal_week(date '2026-09-23') as woche,
  6*   fiscal_day(date '2026-09-23') as tag;

JAHR    QUARTAL    MONAT                WOCHE       TAG
------- ---------- -------------------- ----------- -----------------------
FY2027  Q2-FY2027  SEP-FY2027           W17-FY2027  23-SEP-FY2027

MARCO @ DB26AI:PDB1:>select
  2    fiscal_year_start_date(date '2026-09-23') as jahr_beginn,
  3    fiscal_year_end_date(date '2026-09-23') as jahr_ende,
  4    fiscal_quarter_start_date(date '2026-09-23') as quartal_beginn,
  5    fiscal_quarter_end_date(date '2026-09-23') as quartal_ende,
  6    fiscal_month_start_date(date '2026-09-23') as monat_beginn,
  7    fiscal_month_end_date(date '2026-09-23') as monat_ende,
  8    fiscal_week_start_date(date '2026-09-23') as woche_beginn,
  9*   fiscal_week_end_date(date '2026-09-23') as woche_ende;

JAHR_BEGIN JAHR_ENDE  QUARTAL_BE QUARTAL_EN MONAT_BEGI MONAT_ENDE WOCHE_BEGI WOCHE_ENDE
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
01.06.2026 31.05.2027 01.09.2026 30.11.2026 01.09.2026 30.09.2026 21.09.2026 27.09.2026

MARCO @ DB26AI:PDB1:>select
  2    fiscal_year_number(date '2026-09-23') as jahr_nr,
  3    fiscal_quarter_of_year(date '2026-09-23') as qurtal_nr,
  4    fiscal_month_of_year(date '2026-09-23') as monat_nr,
  5    fiscal_month_of_quarter(date '2026-09-23') as monat_im_quartal,
  6    fiscal_week_of_year(date '2026-09-23') as woche_nr,
  7    fiscal_day_of_year(date '2026-09-23') as tag_nr,
  8    fiscal_day_of_quarter(date '2026-09-23') as tag_im_qurtal,
  9    fiscal_day_of_month(date '2026-09-23') as tag_im_monat,
 10*   fiscal_day_of_week(date '2026-09-23') as tag_in_woche;

   JAHR_NR  QURTAL_NR   MONAT_NR MONAT_IM_QUARTAL   WOCHE_NR     TAG_NR TAG_IM_QURTAL TAG_IM_MONAT TAG_IN_WOCHE
---------- ---------- ---------- ---------------- ---------- ---------- ------------- ------------ ------------
      2027          2          9                1         17        115            23           23            3

 

Allerdings denke ich, dass der Wert von FISCAL_MONTH_OF_YEAR falsch ist. Denn bei einem Start des Geschäftsjahres Anfang Juni sollte das eigentlich der 4. Monat sein.

Fazit

Ich finde, diese Funktionen sind ein weiterer guter Grund, um auf das neue Release der Oracle Datenbank zu wechseln. Nicht unerwähnt bleiben soll die Tatsache, dass es noch ein drittes Paket an Funktionen gibt, die sich auf den National Retail Federation Kalender beziehen. Diese Funktionen beginnen alle mit RETAIL*. 

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich