2017-11-23 24 views
0

私は2つの日付があり、週末は祝祭日&を除外したいと考えています。 私は週末を除外するために管理しますが、祝日平日のPLSQL関数テーブルからの日付の除外

を削除するには、私の機能を変更する方法を見つけ出すことはできません。週末を除く

Table : holidays that looks like this 
    DT_DAY 
- 23/11/2017 
- 02/12/2017 

My機能は次のようになり祝日のテーブルを手に入れました:だから

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(23/11/2017、27/1を使用している場合1/2017)結果はです(原因は今日23/11、明日24/11、月曜日27/11です)。 そして私はテーブル休日にある日数を除外したいので、数えません。

BusinessDays(23/11/2017、27/11/2017)私が探している結果が原因23/11/2017は私の休日のテーブルの上にある ...

+0

(https://stackoverflow.com/questions/252519/count-work-days-between-two-dates)[2つの日付間の作業日数をカウント] – Stavr00

答えて

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')) 
; 
+0

の可能性の重複は、 Thx男!私は少しそれに適応しなければならなかったが、間違いなく正しい方法に私を連れて行きました – Praem