Съхранявайте тези федерални празници в таблица с празници като DATE
въведете и след това опитайте нещо подобно:Намерете най-стария ( MAX
) ден през последните седем дни от месеца, който не е нито събота или неделя, нито празник, споменат в таблицата с празниците.
Предположенията тук са, че 1) не всичките седем дни в края на месеца могат да бъдат празници или уикенд и 2) събота и неделя са почивни. Можете да регулирате level
или съответно клауза where, в зависимост от това дали горното предположение трябва винаги да е вярно или не.
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 );
Много по-добър подход би бил да имате календарна таблица с всички дати от годината и предварително дефинирана колона, наречена isbusinessday
. Тогава заявката ще бъде много по-проста.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');