Oracle计算正常公休或工作日的PL/SQL函数

记录如下

create or replace function f_jg_sxts(date_begin in number,
                                     date_end   in number default to_char(sysdate,
                                                                          'yyyymmdd'),
                                     calctype   in number default 0)
  return number authid current_user is
  /*********************************************************************************
  计算正常公休日或正常工作日,不考虑法定节假日、地方节假日和以及附带的调整工作日
  作者:xxx
  日期:2012年6月21日
  参数:
    in
           date_begin   计算日期区间的始端
           date_end     计算日期区间的末端
           calctype     计算方式,0_计算公休日数,1_计算工作日数
    out
           无
    return
           返回指定时间区间内的而正常公休日数或正常工作日数,取决于calctype参数的输入
  修改描述:
    
  *********************************************************************************/
  date_min number;
  date_max number;
  days     number;
  exception_unknowcalctype exception;
  pragma exception_init(exception_unknowcalctype, -20000);
begin
  if date_end < date_begin then
    date_min := date_end;
    date_max := date_begin;
  else
    date_min := date_begin;
    date_max := date_end;
  end if;
  select sum(decode(to_char(to_date(date_min, 'yyyymmdd') + level - 1, 'd'),
                    1,
                    1,
                    7,
                    1,
                    0))
    into days
    from dual
  connect by level <=
             to_date(date_max, 'yyyymmdd') - to_date(date_min, 'yyyymmdd') + 1;
  if calctype = 0 then
    null;
  elsif calctype = 1 then
    days := to_date(date_max, 'yyyymmdd') - to_date(date_min, 'yyyymmdd') - days + 1;
  else
    raise_application_error(-20000, '未知的日期计算类型');
  end if;
  return(days);
end f_jg_sxts;


 调用示例

declare
  result number;
begin
  -- Call the function
  result := f_jg_sxts(20120101, to_char(sysdate, 'yyyymmdd'));
  dbms_output.put_line(result);
end;


 

你可能感兴趣的:(oracle,工作,exception,Date,function,application)