sql >> Database teknologi >  >> RDS >> Oracle

Alternativ til afkodningsfunktion

Dette kan opnås med en simpel underforespørgsel, som tæller antallet af feriedatoer mellem en angivet dato og dato+5. Følgende vil returnere en dato, der er fem ikke-feriedage i fremtiden:

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

Du skal blot ændre begge "5" så et andet tal for at ændre evalueringsperioden.

SQLFiddle her

Rediger - baseret på kommentaren nedenfor, evaluerer min kode ikke nogen dage efter den femte dag. Dette ville sandsynligvis være meget nemmere med en funktion, men den følgende cte-baserede kode vil også fungere:

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   

Dette script bygger en kalendertabel, så det kan evaluere hver dag (ferie eller ikke-ferie); så får vi en løbende optælling af ikke-feriedage, og bruger den sjette.

SQLFiddle her



  1. Oracle trigger fejl ORA-04091

  2. HVORDAN laver man en join i MySQL, hvor nøglen er en understreng af nøgle2?

  3. Er der nogen fordel ved at have en auto-incrementing primær nøgle i en MySQL pivot tabel?

  4. skabe dynamiske Div-tags til AJAX-PHP-MySQL-genereret tabel