我有两个约会,我想排除周末和公共假期。 我设法排除了周末,但无法弄清楚如何更改我的功能以取消公众假期
有公共假期表
Table : holidays that looks like this
DT_DAY
- 23/11/2017
- 02/12/2017
我排除周末的功能如下所示:
create or replace function BusinessDays(start_date in date, end_date in date)
return number is countBusiness number := 0; /* counter for business days */
begin
countBusiness:= (to_date(end_date,'dd-mm-yy')- to_date(start_date, 'dd-mm-yy')) +1
- (Next_Day(to_date(end_date,'dd-mm-yy'), 'Sunday')
- Next_Day(to_date(start_date,'dd-mm-yy'), 'Sunday') )/7
- (Next_Day(to_date(end_date,'dd-mm-yy'), 'Saturday')
- Next_Day(to_date(start_date,'dd-mm-yy'), 'Saturday') )/7;
return (countBusiness);
end;
所以,如果我使用 BusinessDays(2017年11月23日,2017年11月27日)结果 3 (原因计入今天23/11,明天24/11和星期一27/11) 。 而且我想排除在我的餐桌假期中的日子,所以它不计算它们....以我刚刚给出的例子为准。
BusinessDays(23/11/2017,27/11/2017)我正在寻找的结果是 2 因为23/11/2017已开启我的假期表...
答案 0 :(得分:1)
这是一个改编自this的解决方案:
countBusiness :=
(to_date(end_date,'dd-mm-yy') - to_date(start_date, 'dd-mm-yy'))+1
-
(to_number(to_char(to_date(end_date,'dd-mm-yy'),'IW'))
-
to_number(to_char(to_date(start_date,'dd-mm-yy'),'IW'))
)*2
-
(CASE WHEN to_char(to_date(start_date,'dd-mm-yy'),'D')='7' THEN 1 ELSE 0)
-
(CASE WHEN to_char(to_date(end_date,'dd-mm-yy'),'D')='6' THEN 1 ELSE 0)
-
(SELECT COUNT(1) FROM holidays
WHERE dt_day BETWEEN to_date(start_date,'dd-mm-yy') AND to_date(end_date,'dd-mm-yy'))
;