sql >> Databáze >  >> RDS >> Oracle

Alternativa pro funkci dekódování

Toho lze dosáhnout jednoduchým dílčím dotazem, který počítá počet svátků mezi zadaným datem a datem+5. Následující vrátí datum, které je pět dní mimo prázdniny v budoucnosti:

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

Jednoduše změňte obě "5" tak, že jiné číslo změníte období hodnocení.

SQLFiddle zde

Upravit - na základě komentáře níže můj kód nevyhodnocuje žádné dny po pátém dni. S funkcí by to pravděpodobně bylo mnohem jednodušší, ale následující kód založený na cte bude fungovat také:

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   

Tento skript sestaví tabulku kalendáře, takže může vyhodnotit každý den (svátek i neprázdniny); pak získáme průběžný počet dní, které nejsou svátky, a použijeme šestý.

SQLFiddle zde



  1. Přístup k databázi MySQL přes Jupyter Notebook s Python3

  2. 5 nejlepších nástrojů GUI MySQL (zdarma a placené)

  3. Výpočet vzdálenosti (pythagoras) a počet běhů v dotazu SQL

  4. Vytvoření jednoho až mnoha polymorfních vztahů s doktrínou