Gem disse føderale helligdage i en helligdagstabel som DATE
skriv og prøv noget som dette:Find den ældste ( MAX
) dag i de sidste syv dage i måneden, der hverken er en lørdag eller en søndag eller en helligdag, der er nævnt i helligdagstabellen.
Forudsætningerne her er, at 1) ikke alle syv dage i slutningen af måneden alle kan være helligdage eller weekender, og 2) lørdag og søndage er fri. Du kan justere level
eller hvor klausul i overensstemmelse hermed, afhængig af om ovenstående antagelse altid skal holde stik eller ej.
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 );
En meget bedre tilgang ville være at have en kalendertabel med alle årets datoer og foruddefinerede kolonne kaldet isbusinessday
. Så ville forespørgslen være meget enklere.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');