sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL för sista arbetsdagen i innevarande månad inklusive federala helgdagar i Oracle

Lagra dessa federala helgdagar i en helgdagtabell som DATE skriv och försök sedan ungefär så här:Hitta den äldsta ( MAX ) dag under de sista sju dagarna i månaden som varken är en lördag eller söndag eller en helgdag som nämns i helgdagstabellen.

Antagandena här är att 1) ​​inte alla sju dagar i slutet av månaden alla kan vara helgdagar eller helger och 2) lördagar och söndagar är lediga. Du kan justera level eller where-klausulen i enlighet därmed, beroende på om antagandet ovan alltid ska vara sant eller inte.

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

Ett mycket bättre tillvägagångssätt skulle vara att ha en kalendertabell med alla datum på året och fördefinierad kolumn som heter isbusinessday . Då skulle frågan vara mycket enklare.

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


  1. -bash:imp:kommandot hittades inte oracle

  2. Lista över datum + timmar mellan två datum

  3. Välja och konfigurera maskinvara för SQL Server 2016 Standard Edition

  4. Sanering vid lagring av serialiserad array