一直都沒寫過Oracle的存儲過程,今天忽然來了一個需求:計算指定日期的前N個工做日或者後N個工做日日期(去除週末,法定節假日沒法計算),數據庫
而後研究了一下 Oracle的時間函數和循環方法。具體實現方法以下,也沒啥難的,對數據庫沒研究過,也不知道下面的寫法效率怎麼樣。函數
或者有沒有更好的寫法。o(︶︿︶)o 唉!oop
create or replace procedure proc_CalculationWorkDate ( plan_date in date,--登陸日期 flag in number,--1 往前日期,0日後日期 date_number in number,--天數 out_date out date--計算出的日期 ) is dayOfWeek number:=0;--星期的數字 dates number:=date_number;--往前或者日後的天數(包含工做日的)初始化給他等於天數 i int:=0; j int:=0; begin if flag=1 then--計算往前日期 while i<date_number+1 loop SELECT to_number(to_char(sysdate+i+j,'D')) into dayOfWeek FROM DUAL;--返回星期表明的數值 if dayOfWeek=1 or dayOfWeek=7 then --週六 週日 dates:=dates+1; i:=i; j:=j+1; else i:=i+1; end if; end loop; select plan_date+dates into out_date from dual; --DBMS_OUTPUT.PUT_LINE(dates); end if; if flag=0 then --計算日後日期 while i<date_number+1 loop SELECT to_number(to_char(sysdate-i-j,'D')) into dayOfWeek FROM DUAL; if dayOfWeek=1 or dayOfWeek=7 then dates:=dates+1; i:=i; j:=j+1; else i:=i+1; end if; end loop; select plan_date-dates into out_date from dual; --DBMS_OUTPUT.PUT_LINE(dates); end if; end;