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

Alternative pour la fonction de décodage

Ceci peut être réalisé avec une simple sous-requête qui compte le nombre de dates de vacances entre une date spécifiée et date+5. Ce qui suit renverra une date située cinq jours non fériés dans le futur :

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

Changez simplement les deux "5" en un autre chiffre pour modifier la période d'évaluation.

SQLFiddle ici

Modifier - basé sur le commentaire ci-dessous, mon code n'évalue aucun jour après le cinquième jour. Ce serait probablement beaucoup plus facile avec une fonction, mais le code suivant basé sur cte fonctionnera également :

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   

Ce script construit une table de calendrier afin qu'il puisse évaluer chaque jour (jour férié ou non); puis nous obtenons un décompte des jours non fériés et utilisons le sixième.

SQLFiddle ici