Uložte tyto federální svátky do tabulky svátků jako DATE
zadejte a zkuste něco takového:Najděte nejstarší ( MAX
) den v posledních sedmi dnech v měsíci, který není sobotou ani nedělí ani svátkem uvedeným v tabulce svátků.
Zde se předpokládá, že 1) ne všech sedm dní na konci měsíce mohou být svátky nebo víkendy a 2) sobota a neděle jsou volné. Můžete upravit level
nebo klauzule where podle toho, v závislosti na tom, zda by výše uvedený předpoklad měl vždy platit nebo ne.
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 );
Mnohem lepším přístupem by bylo mít tabulku Kalendář se všemi daty roku a předdefinovaným sloupcem nazvaným isbusinessday
. Pak by byl dotaz mnohem jednodušší.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');