Lagra dessa federala helgdagar i en helgdagtabell som DATE
skriv och försök sedan ungefär så här:Hitta den äldsta ( MAX
) dag under de sista sju dagarna i månaden som varken är en lördag eller söndag eller en helgdag som nämns i helgdagstabellen.
Antagandena här är att 1) inte alla sju dagar i slutet av månaden alla kan vara helgdagar eller helger och 2) lördagar och söndagar är lediga. Du kan justera level
eller where-klausulen i enlighet därmed, beroende på om antagandet ovan alltid ska vara sant eller inte.
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 );
Ett mycket bättre tillvägagångssätt skulle vara att ha en kalendertabell med alla datum på året och fördefinierad kolumn som heter isbusinessday
. Då skulle frågan vara mycket enklare.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');