Der ultimative Leitfaden zum Ausschließen von Wochenenden und Feiertagen in Oracle SQL (Ausgabe 2024)

Hallo! Hier ist euer kleiner Feiertagsassistent mit einem weiteren technischen Feiertags-Hack. Kürzlich fragte mich einer unserer SQL-erfahrenen Benutzer, wie man Abfragen erstellt, die Wochenenden und Feiertage in Oracle ignorieren – Sie wissen schon, für diese „Nur Werktage“-Berichte, die Finanzteams glücklich machen. Ich erkläre es euch anhand einiger Beispiele aus der Praxis in einfachen Worten.
Das Wichtigste zuerst: Die Berechnung von Werktagen ist weitaus häufiger, als Sie denken. Ob Sie SLA-Zeitpläne, Bearbeitungszeiträume oder einfach nur die Arbeitstage zwischen Daten verfolgen – das Überspringen von Samstagen, Sonntagen und Feiertagen bereitet häufig Kopfzerbrechen. Die gute Nachricht? Oracle SQL bietet hierfür einige raffinierte Datumsfunktionen, aber die Sache hat einen Haken …
Das Wochenendproblem (und die einfache Lösung)
Wochenenden sind der einfache Teil. Mit der TO_CHAR-Funktion von Oracle im Formatmodell „D“ können Sie die Tagesnummern (1=Sonntag bis 7=Samstag) überprüfen. Hier ist ein schneller Trick, um sie herauszufiltern:
SELECT Bestelldatum
VON Bestellungen
WHERE TO_CHAR(Bestelldatum, 'D') NOT IN ('1','7')
Aber warten Sie – dies setzt voraus, dass Sonntag Tag 1 ist. Einige Orte beginnen die Woche am Montag, also überprüfen Sie es noch einmal mit SELECT TO_CHAR(SYSDATE, 'D') FROM dual zuerst. Profi-Tipp: Für klareren Code verwenden Sie NICHT IN (6,7) wenn Sie ISO-Standard sind (Montag=1).
Der Urlaubskopfschmerz (und wie man ihn löst)
Und jetzt wird es spannend. Anders als Wochenenden sind Feiertage nicht in Oracle festgeschrieben – sie ändern sich jährlich und variieren je nach Land/Region. Es gibt zwei gute Ansätze:
1. Feiertagstabellenmethode: Erstellen Sie eine Tabelle „FEIERT“ mit allen relevanten Daten und dann:
SELECT Arbeitsdatum
VON Projektdaten
WHERE TO_CHAR(Arbeitsdatum, 'D') NICHT IN (6,7)
UND Arbeitsdatum NICHT IN (WÄHLEN Sie Feiertagsdatum AUS Feiertagen)
2. Dynamische Datumsberechnung: Verwenden Sie für feste Feiertage (wie den 4. Juli in den USA) eine bedingte Logik:
WO NICHT (
(TO_CHAR(Datumsfeld, 'MMTT') = '0101' -- Neujahr
ODER (TO_CHAR(Datumsfeld, 'MMTT') = '1225' – Weihnachten
-- Fügen Sie bei Bedarf weitere feste Termine hinzu
)
Professionelle Geschäftstagberechnungen
Müssen Sie Werktage zwischen Daten zählen? Kombinieren Sie unsere Tricks mit einer rekursiven CTE- oder Kalendertabelle. Hier ist ein praktisches Beispiel mit einem generierten Datumsbereich:
MIT Datumsbereich ALS (
SELECT start_date + LEVEL - 1 AS calc_date
VON (AUSWÄHLEN BIS_DATUM('01-JAN-2024') ALS Startdatum,
TO_DATE('31-DEC-2024') AS end_date FROM dual)
VERBINDEN NACH EBENE <= Enddatum - Startdatum + 1
)
SELECT COUNT(*) AS Werktage
VON Datumsbereich
WHERE TO_CHAR(calc_date, 'D') NOT IN (6,7)
UND Berechnungsdatum NICHT IN (SELECT holiday_date FROM company_holidays)
Denken Sie daran, Ihren spezifischen Feiertagsplan zu berücksichtigen – Bundesfeiertage unterscheiden sich von Firmenfeiertagen, und internationale Abläufe erhöhen die Komplexität. Einige Teams führen auch separate Tabellen für gesetzliche und tatsächliche Feiertage!
Hier ist es also – Ihr komplettes Toolkit für Wochenend- und Feiertagsausschlüsse in Oracle SQL. Ob Sie Berichte erstellen, Fristen berechnen oder Geschäftszyklen analysieren – mit diesen Techniken bleiben Ihre Datumsberechnungen präzise. Und falls Ihr Unternehmen den National Pizza Day plötzlich zum Feiertag erklärt (das wäre doch schön!), tragen Sie ihn einfach in Ihre Feiertagstabelle ein, und Ihre Abfragen berücksichtigen den neuen freien Tag automatisch.
FAQpro-Tipp: Testen Sie Grenzfälle immer an Feiertagswochenenden – der Dienstag nach einem Feiertag kann die Datumsberechnungen manchmal durcheinanderbringen. Vielen Dank fürs Lesen und hoffen, dass alle Ihre Anfragen schnell beantwortet werden (im Gegensatz zu Behörden an Feiertagen)! Haben Sie ein kniffliges Datumsszenario? Kontaktieren Sie uns, wir helfen Ihnen dabei.