Oracle
 sql >> Database >  >> RDS >> Oracle

Alternativa per la funzione di decodifica

Ciò può essere ottenuto con una semplice sottoquery che conta il numero di date di ferie tra una data specificata e data+5. Quanto segue restituirà una data futura di cinque giorni non festivi:

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

Basta cambiare entrambi i "5" in modo che un altro numero cambi il periodo di valutazione.

SQLFiddle qui

Modifica - in base al commento di seguito, il mio codice non valuta alcun giorno dopo il quinto giorno. Questo sarebbe probabilmente molto più semplice con una funzione, ma funzionerà anche il seguente codice basato su cte:

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   

Questo script crea una tabella di calendario in modo che possa valutare ogni giorno (festivo o non festivo); quindi otteniamo un conteggio progressivo dei giorni non festivi e utilizziamo il sesto.

SQLFiddle qui