sql >> Base de Datos >  >> RDS >> Oracle

Alternativo para la función de decodificación

Esto se puede lograr con una subconsulta simple que cuenta el número de fechas de vacaciones entre una fecha específica y fecha+5. Lo siguiente devolverá una fecha de cinco días no festivos en el futuro:

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

Simplemente cambie ambos "5" por otro número para cambiar el período de evaluación.

SQLFiddle aquí

Editar - según el comentario a continuación, mi código no evalúa ningún día después del quinto día. Esto probablemente sería mucho más fácil con una función, pero el siguiente código basado en cte también funcionará:

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   

Este script crea una tabla de calendario para que pueda evaluar cada día (festivo o no festivo); luego obtenemos un conteo continuo de días no festivos y usamos el sexto.

SQLFiddle aquí