/ / Alternate for decoding function - oracle

Alternatívna funkcia dekódovania - oracle

Mám stôl "Dovolenka", ktorý obsahuje zoznam súborovdovolenkové detaily.Ak určím dátum, mali by som získať dátum dosiahnutia výsledku po 5 dňoch od stanoveného dátumu.Ak je medzi nimi dovolenka by mala vylúčiť a zobraziť dátum bez dovolenky.Mám stôl s názvom dovolenka, ktorá zahŕňa dátum dovolenky, dovolenku typ | (týždenné vypnutie, miestny sviatok) .Teraz som použil vnorené dekódovanie pre nepretržitú kontrolu dovolenky.Povedzte mi, ako to možno zmeniť v prípade funkcií.

DECODE
(date,
holidaydate, DECODE
(date + 1,
holidaydate + 1, DECODE
(date + 2,
holidaydate + 2, DECODE
(date + 3,holidaydate+3,date+4,date+3),date+2),date+1),date);

odpovede:

4 pre odpoveď č. 1

To sa dá dosiahnuť jednoduchým poddotazom, ktorý počíta počet dní dovolenky medzi stanoveným dátumom a dátumom + 5. V nasledujúcom prípade sa vráti dátum, ktorý bude v budúcnosti päť dní bez dovolenky:

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

Jednoducho zmeňte obe "5" tak ďalšie číslo, aby sa zmenilo obdobie hodnotenia.

SQLFiddle tu

editovať - na základe komentára nižšie môj kód nehodnotí žiadne dni po piatom dni, čo by s funkciou pravdepodobne bolo oveľa jednoduchšie, ale bude fungovať aj tento kód založený na cte:

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 vytvára tabuľku kalendára, takže môže každý deň vyhodnocovať (dovolenku alebo dovolenku); potom získame bežný počet dní, ktoré nie sú na dovolenke, a použite šiestu.

SQLFiddle tu


1 pre odpoveď č. 2

AFAIK, Môžete použiť CASE alternatíva k DECODE v Oracle

CASE [ expression ]

WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
WHEN condition_n THEN result_n

ELSE result

END

0 pre odpoveď č. 3

Na záver som našiel optimálne riešenie.Ďakujem za ur odpoveď chlapci. SELECT dt FROM (SELECT dt FROM (SELECT TO_DATE("15-AUG-2013","dd-mon-yyyy")+LEVEL dt FROM DUAL CONNECT BY LEVEL < 30)
WHERE (SELECT COUNT (*) FROM mst_holiday WHERE holidaydate = dt) = 0 ) where rownum=1