Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle SQL per l'ultimo giorno lavorativo del mese corrente comprese le festività federali in Oracle

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');