Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle SQL pour le dernier jour ouvrable du mois en cours, y compris les jours fériés fédéraux dans Oracle

Stockez ces jours fériés fédéraux dans une table de jours fériés en tant que DATE tapez et essayez quelque chose comme ceci :Rechercher le plus ancien ( MAX ) jour des sept derniers jours du mois qui n'est ni un samedi ni un dimanche ni un jour férié mentionné dans le tableau des jours fériés.

Les hypothèses ici sont que 1) les sept jours à la fin du mois ne peuvent pas tous être des jours fériés ou des week-ends et 2) le samedi et le dimanche sont chômés. Vous pouvez ajuster le level ou la clause where en conséquence, selon que l'hypothèse ci-dessus doit toujours être vraie ou non.

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

Une bien meilleure approche serait d'avoir une table Calendar avec toutes les dates de l'année et une colonne prédéfinie appelée isbusinessday . La requête serait alors beaucoup plus simple.

SELECT MAX(dt)
  FROM calendar
  WHERE isbusinessday = 'Y' 
AND TO_CHAR(dt,'YYYYMM') = TO_CHAR(SYSDATE,'YYYYMM');