Bewaar die federale feestdagen in een vakantietabel als DATE
typ en probeer dan zoiets als dit:Zoek de oudste ( MAX
) dag in de laatste zeven dagen van de maand die geen zaterdag, zondag of feestdag is die in de vakantietabel wordt vermeld.
De aannames hier zijn dat 1) niet alle zeven dagen aan het einde van de maand allemaal feestdagen of weekenden kunnen zijn en 2) zaterdag en zondag vrij zijn. U kunt het level
aanpassen of waar clausule dienovereenkomstig, afhankelijk van of de bovenstaande veronderstelling altijd waar moet zijn of niet.
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 );
Een veel betere benadering zou zijn om een kalendertabel te hebben met alle datums van het jaar en een vooraf gedefinieerde kolom met de naam isbusinessday
. Dan zou de vraag veel eenvoudiger zijn.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');