sql >> Base de Datos >  >> RDS >> Oracle

Oracle SQL para el último día hábil del mes actual, incluidos los feriados federales en Oracle

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