Speichern Sie diese Feiertage in einer Feiertagstabelle als DATE
Geben Sie Folgendes ein und versuchen Sie es dann:Älteste finden ( MAX
) Tag in den letzten sieben Tagen des Monats, der weder ein Samstag oder Sonntag noch ein in der Feiertagstabelle aufgeführter Feiertag ist.
Die Annahmen hier sind, dass 1) nicht alle sieben Tage am Ende des Monats Feiertage oder Wochenenden sein können und 2) Samstag und Sonntag frei sind. Sie können die level
anpassen oder where-Klausel entsprechend, je nachdem, ob die obige Annahme immer zutreffen soll oder nicht.
SELECT MAX(dt) AS last_working_day
FROM
(
SELECT last_day(SYSDATE) - level + 1 as dt
FROM dual CONNECT BY
level <= 7 -- the last seven days of the month
) WHERE TO_CHAR(dt,'DY', 'NLS_DATE_LANGUAGE = AMERICAN') NOT IN ('SAT','SUN')
AND dt NOT IN ( SELECT holiday from federal_holidays );
Ein viel besserer Ansatz wäre eine Kalendertabelle mit allen Daten des Jahres und einer vordefinierten Spalte namens isbusinessday
. Dann wäre die Abfrage viel einfacher.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');