我原先在SQLSeve2000下使用自定义函数,可是转到Oracle下因为不能用临时表,所以不知道怎么办了。

解决方案 »

  1.   

    如果只把周一至周五看作工作日,可以只用一句sql来实现,to_char(yourdate,'d')是取星期几的函数,1-7分别表示周日到周六。
    但实际情况并不是这样,有每年的法定节假日,有五一、十一的串休,不同的公司还有自身的休息日(也有每周六天工作的),这样我们通常建一个表来存储和维护这些休息日,然后在查询时到表中查找两段时间内休息日的天数,剩下的时间就是工作日。
      

  2.   

    create or replace  function
    Howworkday(begindate date,enddate date)
    return integer
    as
    v_b  date;
    v_Num  integer;
    begin
      v_b:=begindate;
      v_num:=0;
      while v_b <= enddate loop
         If to_char(v_b,'d') =1 or to_char(v_b,'d') =7
         then
           v_num := v_num;
         Else
          v_num:=v_num+1;
         End if;
         v_b := v_b+ 1;
      End loop;
    return v_num;
    End;select   Howworkday(to_date('20060101','yyyymmdd'),to_date('20060201','yyyymmdd'))
    from dual23
      

  3.   

    Select Round(To_Number(To_Date('20070203', 'yyyymmdd') -To_Date('20060203', 'yyyymmdd')) , 1 )
     From Dual;
      

  4.   

    SQL> Select Round(To_Number(To_Date('20070203', 'yyyymmdd') -
      2  To_Date('20060203', 'yyyymmdd')) , 1 )
      3  From Dual;ROUND(TO_NUMBER(TO_DATE('20070
    ------------------------------
                               365
      

  5.   

    select (trunc(&end_dt - &start_dt) - ((case WHEN (8-to_number(to_char(&start_dt,'D'))) > trunc(&end_dt -&start_dt)+1 THEN 0 ELSE trunc( (trunc(&end_dt - &start_dt) - (8-to_number(to_char(&start_dt,'D') ))) / 7 ) + 1 END) + (case WHEN mod(8-to_char(&start_dt,'D'),7) > trunc(&end_dt - &start_dt)-1 THEN 0 ELSE trunc( (trunc(&end_dt-&start_dt) - (mod(8-to_char(&start_dt,'D'),7)+1)) / 7 ) + 1  END))) as workingdays from dual计算end_dt 和 start_dt之间的工作日,不含start_dt当日
      

  6.   

    以上不包含国家法定的节假日,只是单纯的理解工作日为周一到周五,如果需要计算时考虑国家法定的节假日的话,waterfirer(水清) 提供的方式就很好,简单,通用性强
      

  7.   

    SQL> select trunc(dd/7)*5+mod(dd,7)-abs(decode(to_char(to_date('2006-03-01','yyyy-mm-dd'),'d')
      2  ,7,1,1,2,0)-decode(to_char(to_date('2006-03-22','yyyy-mm-dd'),'d'),7,1,1,2,0)) workday
      3  from (
      4  select to_date('2006-03-22','yyyy-mm-dd')-to_date('2006-03-01','yyyy-mm-dd') dd
      5  from dual);   WORKDAY
    ----------
            15SQL> 
    SQL> select trunc(dd/7)*5+mod(dd,7)-abs(decode(to_char(to_date('2006-03-01','yyyy-mm-dd'),'d')
      2  ,7,1,1,2,0)-decode(to_char(to_date('2006-03-25','yyyy-mm-dd'),'d'),7,1,1,2,0)) workday
      3  from (
      4  select to_date('2006-03-25','yyyy-mm-dd')-to_date('2006-03-01','yyyy-mm-dd') dd
      5  from dual);   WORKDAY
    ----------
            17SQL>
      

  8.   

    select count(*) from (
       select rownum-1 rnum from all_objects
       where rownum <= to_date('2006-03-26','yyyy-mm-dd')-to_date('2006-03-01','yyyy-mm-dd')+1
       )
       where to_char(to_date('2006-03-01','yyyy-mm-dd')+rnum-1,'D')
       not in ('6','7')---------
    18