工作日的PLSQL功能&从表中排除日期

时间:2017-11-23 16:30:23

标签: sql plsql

我有两个约会,我想排除周末和公共假期。 我设法排除了周末,但无法弄清楚如何更改我的功能以取消公众假期

有公共假期表

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已开启我的假期表...

1 个答案:

答案 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'))
;