Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle SQL für den letzten Geschäftstag des aktuellen Monats, einschließlich gesetzlicher Feiertage in Oracle

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');