0

我有一个“假期”表,其中列出了一组假期详细信息。如果我指定一个日期,我应该在指定日​​期的 5 天后获得结果日期。如果中间有假期,它应该排除它们并显示非假期日期.我有一个名为假期的表,其中包括假期日期,假期类型|(每周休息,当地假期)。现在我已经使用嵌套解码进行连续假期检查。告诉我如何改变这种情况下的功能。

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

3 回答 3

4

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

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

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

SQLFiddle在这里

编辑- 根据下面的评论,我的代码在第五天后的任何天都不会评估。使用函数可能会更容易,但以下基于 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在这里

于 2013-08-20T12:26:19.153 回答
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
于 2013-08-20T09:41:33.350 回答
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

于 2013-08-23T03:50:20.210 回答