替代解码功能

时间:2013-08-20 09:25:48

标签: oracle

我有一个表'假日',其中列出了一组假日细节。如果我指定一个日期,我应该在指定日​​期的5天后获得结果日期。如果有假期,它应该排除它们并显示非假日日期。我有一个名为holiday的表,其中包括假日日期,假日类型|(每周休假,当地假日)。现在我已经使用嵌套解码进行连续假日检查。告诉我如何在案例功能中更改它。

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);

3 个答案:

答案 0 :(得分:4)

这可以通过一个简单的子查询来实现,该子查询计算指定日期和日期+5之间的假日日期数。以下将返回将来五个非假日日期的日期:

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

只需将“5”更改为另一个数字即可更改评估期。

SQLFiddle here

修改 - 根据以下评论,我的代码不会评估第五天之后的任何日期。使用函数可能会更容易,但以下基于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   

此脚本构建一个日历表,以便评估每一天(假日或非假日);然后我们得到非假期日的运行计数,并使用第六个。

SQLFiddle here

答案 1 :(得分:1)

AFAIK,您可以在Oracle中使用CASE替代DECODE

CASE [ expression ]

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

   ELSE result

END

答案 2 :(得分:0)

最后我找到了最佳解决方案。谢谢你的回复。 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