sql >> Database >  >> RDS >> Oracle

Oracle SQL voor de laatste werkdag van de huidige maand inclusief federale feestdagen in Oracle

Bewaar die federale feestdagen in een vakantietabel als DATE typ en probeer dan zoiets als dit:Zoek de oudste ( MAX ) dag in de laatste zeven dagen van de maand die geen zaterdag, zondag of feestdag is die in de vakantietabel wordt vermeld.

De aannames hier zijn dat 1) niet alle zeven dagen aan het einde van de maand allemaal feestdagen of weekenden kunnen zijn en 2) zaterdag en zondag vrij zijn. U kunt het level aanpassen of waar clausule dienovereenkomstig, afhankelijk van of de bovenstaande veronderstelling altijd waar moet zijn of niet.

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

Een veel betere benadering zou zijn om een ​​kalendertabel te hebben met alle datums van het jaar en een vooraf gedefinieerde kolom met de naam isbusinessday . Dan zou de vraag veel eenvoudiger zijn.

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


  1. Volgorde bestaat niet als dat wel het geval is - Postgres/Spring Boot

  2. Gebruik meerdere conflict_targets in ON CONFLICT-clausule

  3. Hoe een reeks rijen van de ene functie in de andere doorgeven?

  4. Ontbrekende puntkomma's aan het einde van de regel van het door JPA gegenereerde sql-script