Memorizza le festività federali in una tabella delle festività come DATE
digita e poi prova qualcosa del genere:Trova il più vecchio ( MAX
) giorno degli ultimi sette giorni del mese che non sia né sabato né domenica né festivo menzionato nella tabella delle festività.
Le ipotesi qui sono che 1) non tutti i sette giorni alla fine del mese possono essere tutti festivi o fine settimana e 2) il sabato e la domenica sono chiusi. Puoi modificare il level
o dove clausola di conseguenza, a seconda che l'ipotesi di cui sopra debba sempre valere o meno.
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 );
Un approccio molto migliore sarebbe avere una tabella Calendar con tutte le date dell'anno e una colonna predefinita chiamata isbusinessday
. Quindi la query sarebbe molto più semplice.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');