我有一个表'假日',其中列出了一组假日细节。如果我指定一个日期,我应该在指定日期的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);
答案 0 :(得分:4)
这可以通过一个简单的子查询来实现,该子查询计算指定日期和日期+5之间的假日日期数。以下将返回将来五个非假日日期的日期:
testdate+(select 5+count(1)
from holiday
where holidaydate between testdate
and testdate + 5)
只需将“5”更改为另一个数字即可更改评估期。
修改 - 根据以下评论,我的代码不会评估第五天之后的任何日期。使用函数可能会更容易,但以下基于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
此脚本构建一个日历表,以便评估每一天(假日或非假日);然后我们得到非假期日的运行计数,并使用第六个。
答案 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