日期:2014-05-17  浏览次数:21902 次

Warning:Function created with compilation errors
 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