Almacene esos feriados federales en una tabla de feriados como DATE
escriba y luego intente algo como esto:Encuentre el más antiguo ( MAX
) día de los últimos siete días del mes que no es ni sábado ni domingo ni festivo mencionado en la tabla de festivos.
Las suposiciones aquí son que 1) no todos los siete días al final del mes pueden ser feriados o fines de semana y 2) los sábados y domingos están libres. Puede ajustar el level
o cláusula where en consecuencia, dependiendo de si la suposición anterior siempre debe ser cierta o no.
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 enfoque mucho mejor sería tener una tabla de Calendario con todas las fechas del año y una columna predefinida llamada isbusinessday
. Entonces la consulta sería mucho más sencilla.
SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');