Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Alternar para a função de decodificação


Isso pode ser feito com uma simples subconsulta que conta o número de datas de feriados entre uma data especificada e data+5. O seguinte retornará uma data que é cinco dias não feriados no futuro:
testdate+(select 5+count(1) 
            from holiday
           where holidaydate between testdate
                                 and testdate + 5)

Basta alterar os dois "5"s para outro número para alterar o período de avaliação.

SQLFiddle aqui

Editar - com base no comentário abaixo, meu código não avalia nenhum dia após o quinto dia. Isso provavelmente seria muito mais fácil com uma função, mas o seguinte código baseado em cte também 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 constrói uma tabela de calendário para poder avaliar cada dia (feriado ou não); em seguida, obtemos uma contagem contínua de dias sem feriados e usamos o sexto.

SQLFiddle aqui