sql >> Databasteknik >  >> RDS >> Oracle

Alternativ för avkodningsfunktion

Detta kan uppnås med en enkel underfråga som räknar antalet semesterdatum mellan ett angivet datum och datum+5. Följande kommer att returnera ett datum som är fem helgfria dagar i framtiden:

testdate+(select 5+count(1) 
            from holiday
           where holidaydate between testdate
                                 and testdate + 5)

Ändra helt enkelt båda "5" så att ett annat nummer för att ändra utvärderingsperioden.

SQLFiddle här

Redigera - Baserat på kommentaren nedan utvärderas inte min kod några dagar efter den femte dagen. Detta skulle förmodligen vara mycket enklare med en funktion, men följande cte-baserade kod fungerar också:

with cte as ( (select alldate,holidaydate 
                 from (select to_date('20130101','yyyymmdd')+level alldate 
                         from dual 
                       connect by level < 10000 -- adjust for period to evaluate
                      ) alldates 
                      left join holiday on alldate=holidaydate) )
select 
    testdate,test_plus_five
from ( 
    select 
        alldate test_plus_five,testdate,
        sum(case when holidaydate is null 
                 then 1 
                 else 0 end) over (partition by testdate order by alldate) lastday 
    from 
        cte,
        testdates
    where
        alldate >= testdate
    group by
        alldate,holidaydate,testdate)
where
    lastday = 6   

Detta skript bygger en kalendertabell så att den kan utvärdera varje dag (helgdag eller icke-helgdag); då får vi en löpande räkning av helgfria dagar och använder den sjätte.

SQLFiddle här



  1. SQL-tabellen finns inte

  2. Django JSONField inuti ArrayField

  3. Versaler av dag- och månadsnamn vid formatering av datum i Oracle

  4. Hur kan jag göra en asynkron databas i JavaFX