sql >> Database >  >> RDS >> Oracle

Alternatief voor decodeerfunctie

Dit kan worden bereikt met een eenvoudige subquery die het aantal vakantiedata telt tussen een bepaalde datum en date+5. Het volgende geeft een datum terug die vijf niet-vakantiedagen in de toekomst ligt:

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

Verander eenvoudig beide "5"-en, dus een ander nummer om de evaluatieperiode te wijzigen.

SQLFiddle hier

Bewerken - op basis van onderstaande opmerking evalueert mijn code geen dagen na de vijfde dag. Dit zou waarschijnlijk veel gemakkelijker zijn met een functie, maar de volgende op cte gebaseerde code zal ook werken:

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   

Dit script bouwt een kalendertabel zodat het elke dag kan evalueren (vakantie of niet-vakantie); dan krijgen we een lopende telling van niet-vakantiedagen en gebruiken we de zesde.

SQLFiddle hier



  1. Primaire sleutel sorteren

  2. MariaDB SUBSTR() uitgelegd

  3. Hoe voeg ik nieuwe invoer toe aan de registerpagina laravel?

  4. Haal pl/sql-array-retourwaarden op in java