Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle SQL para o último dia útil do mês atual, incluindo feriados federais no oracle


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