日期:2014-05-17 浏览次数:21902 次
create or replace function Count_Workday(Start_Time date, Finish_Time date)
return varchar2 as
s_Time date; --开始时间
f_Time date; --结束时间
w_Day_0 int; --求开始时间和结束时间的工作日(未计算节日)
w_Day_1 int; --阳历节日
w_Day_2 int; --农历节日
w_Day_All int; --开始时间和结束时间的节日数
o_OutPut VARCHAR2(125); --返回值
e_ErrMsg VARCHAR2(200); --异常
e_Error1 EXCEPTION;
e_Error2 EXCEPTION;
begin
s_Time := Start_Time; --赋值
f_Time := Finish_Time;
--异常判断
if s_Time < TO_DATE('1900-01-31', 'YYYY-MM-DD') or
f_Time > to_date('2050-01-23', 'YYYY-MM-DD') then
raise error1;
end if;
if f_time - s_time < 0 then
raise error2;
end if;
--先统计除开节日以外的所以假日,也就是星期六和星期天
w_Day_0 := trunc((f_Time - s_Time + 1) / 7) * 5 + nvl(length(replace(substr('01111100111110', to_char(s_Time,'d'), mod(f_Time - s_Time + 1, 7)),'0',''));
--统计开始时间和结束时间之间的节日数
select count(*)
into w_Day_1
from (select to_char(s_Time + rownum - 1, 'MM-DD') as a
from dual
connect by rownum <= f_Time - s_Time) t
where t.a in ('05-01', '01-01' , '10-01', '10-02', '10-03'); --计算农历青年节或者元旦的节日数以及国庆
w_Day_All := w_Day_1; --累加
select count(*)
into w_Day_2
from (select f_getlunar(s_Time + rownum - 1) as a--f_getlunar是一个阳历转农历的自定义函数,这里无错
from dual
connect by rownum <= f_Time - s_Time) t
where t.a like '04月 05日'
or t.a like '05月 05日'
or t.a like '08月 15日'
or t.a like '01月 01日'
or t.a like '01月 02日'
or t.a like '01月 03日'; --润月的节日不放假,格式
w_Day_All := w_Day_All + w_Day_2; --累加
-- 格式化返回值
o_OutPut := to_char(w_Day_0 - w_Day_All) || '天';
RETURN o_OutPut;
EXCEPTION
WHEN e_Error1 THEN
RETURN '日期错误! 有效范围(阳历): 1900/01/31 - 2050/01/22';
when e_Error2 then
&n