Armazene esses feriados federais em uma tabela de feriados como
DATE
digite e tente algo assim:Encontre o mais antigo ( MAX
) nos últimos sete dias do mês que não seja sábado nem domingo nem feriado mencionado na tabela de feriados. As suposições aqui são de que 1) nem todos os sete dias no final do mês podem ser feriados ou finais de semana e 2) sábado e domingo estão livres. Você pode ajustar o
level
ou cláusula where de acordo, dependendo se a suposição acima deve sempre ser verdadeira ou não. 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 );
Uma abordagem muito melhor seria ter uma tabela de calendário com todas as datas do ano e uma coluna predefinida chamada
isbusinessday
. Então a consulta seria muito mais simples. SELECT MAX(dt)
FROM calendar
WHERE isbusinessday = 'Y'
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');