Zapisz te święta państwowe w tabeli świąt jako DATE
wpisz, a następnie spróbuj czegoś takiego:Znajdź najstarszy ( MAX
) dzień w ciągu ostatnich siedmiu dni miesiąca, który nie jest sobotą, niedzielą ani świętem wymienionym w tabeli dni świątecznych.
Założenia są takie, że 1) nie wszystkie siedem dni na koniec miesiąca mogą być świętami lub weekendami oraz 2) soboty i niedziele są wolne. Możesz dostosować level
lub klauzula gdzie odpowiednio, w zależności od tego, czy powyższe założenie powinno zawsze być prawdziwe, czy nie.
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 );
O wiele lepszym rozwiązaniem byłoby posiadanie tabeli kalendarza ze wszystkimi datami roku i predefiniowaną kolumną o nazwie isbusinessday
. Wtedy zapytanie byłoby znacznie prostsze.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');