赛迪网技术社区 » Oracle » 两种方法分析每月工作日计算程序 转到动态网页
--> 本页主题: 两种方法分析每月工作日计算程序 返回 | 悬赏 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题
3946469




用户名: 3946469
级别: 高级工程师
精华: 4
发帖: 197
经验值: 252 点
积分: 502 分
贡献值: 0
注册时间:2007-04-18


两种方法分析每月工作日计算程序


SQL> SELECT TEXT FROM USER_SOURCE WHERE TYPE='PROCEDURE' AND NAME='GZR'; 0j.q$i<Sm  
   *g@Bf C:C  
  TEXT                                                 QaCPC"  
  ---------------------------------------------------------------------------------------------------- Y>p7  
  procedure gzr(v_nowdate in varchar2) as                               aaCP<D=  
  v_firstsaturday varchar2(10);                                    D{& Og-cX  
  v_outdate date;                                           td#;aM6  
  v_countworkday number(10);                                      3)7u  
  begin                                                )D>8QY7  
        select to_char(next_day(to_date(concat(v_nowdate,'01'),'yyyymmdd'),1)-1,'dd')          6zE 5Y  
       into v_firstsaturday                                       E` ]q8  
       from sys.dual;                                          2 ";4<7r,  
   v_countworkday:=to_number(v_firstsaturday)-1;                           beih#2QS  
   loop                                                a[aYV,3i#b  
    v_outdate:=to_date(concat(v_nowdate,v_firstsaturday+7),'yyyymmdd');                % K7Ky  
    if v_outdate yyymm'),'01'),'yyyymmdd') then                                    +pP J&7  
                                                     @H[0 7}r  
     v_countworkday:=v_countworkday+5;                               rpI)z5"  
     else                                              J!6t)s8  
     v_countworkday:=v_countworkday+5-to_number(v_outdate-to_date(concat(to_char(add_months(sysdate zCgp 6"V  
  ,1),'yyyymm'),'01'),'yyyymmdd'));                                  ^/1>2$-^4:  
                                                     QiEL&`  
    end if;                                             O49J{ | K  
   exit when v_outdate>=to_date(concat(to_char(add_months(sysdate,1),'yyyymm'),'01'),'yyyymmdd');   (lK$X3o4v)  
   ){VjQ9c<6  
  TEXT 8A"eGrj"Ai  
   6-F\8I@)j  
  CREATE OR REPLACE FUNCTION Get_WorkingDays( Fg&(P F  
   ny IN VARCHAR2 =s28 nR<  
  ) RETURN INTEGER IS HA>?IjX_  
  /*------------------------------------------------------------------------------------------ /B~ Y 8  
  函数名称:Get_WorkingDays \Jg%J _K  
  中文名称:求某一年月中共有多少工作日 n}kchdxY  
  作者姓名: XINGPING }~{:28>FC"  
  编写时间: 2004-05-22 9y/[V{-  
  输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405 /!w~\jB  
  返 回 值:整型值,包含的工作日数目。 ^y @i}H  
  算法描述: sp7%FJStk  
    1).列举出参数给出的年月中的每一天。这里使用了一个表(ljrq是我的库中的一张表。这个表可以是有权访问的、记录条数至少为31的任意一张表或视图)来构造出某年月的每一天。 |1g7>:zJ  
    2).用这些日期和一个已知星期几的日期相减(2001-12-30是星期天),所得的差再对7求模。如果所求年月在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. W$x iJ';#  
    3).过滤掉结果集中值为0和6的元素,然后求count,所得即为工作日数目。    L; HJ@  
  -------------------------------------------------------------------------------------------------*/ )/6d$P_"AJ  
   Result INTEGER; ,|gmQ}W  
  BEGIN N >PQ!t3  
   SELECT COUNT(*) INTO Result -vO8\O01D  
    FROM (SELECT MOD(MOD(q.rq-to_date('2001-12-30','yyyy-mm-dd'),7),7) weekday 7@pHVhT  
        FROM ( SELECT to_date(ny||t.dd,'yyyymmdd') rq 'O1,R;u!  
             FROM (SELECT substr(100+ROWNUM,2,2) dd z= LGR  
                 FROM ljrq z WHERE Rownum<=31 -t(?j%ZR  
               ) t RT}pd[UQkz  
             WHERE to_date(ny||t.dd,'yyyymmdd') ek pRP  
              BETWEEN to_date(ny,'yyyymm') cgbw A  
                AND last_day(to_date(ny,'yyyymm')) 1&Q]F  
           )q s8]}y06PS  
       ) a  W^!y*  
    WHERE a.weekday NOT IN(0,6);   ;u` XWb   
   RETURN Result;  ?)#/TQ  
  END Get_WorkingDays; XdJ (mN   
   F [!p^| A  
  CREATE OR REPLACE FUNCTION Get_WorkingDays( ,F\:8,ixT/  
   ny IN VARCHAR2 =MC0m8oyD  
  ) RETURN INTEGER IS ~a7i #t1  
  /*----------------------------------------------------------------------------------------- :D$PC] V]  
  函数名称:Get_WorkingDays wUJd-,!  
  中文名称:求某一年月中共有多少工作日 a/Wuv'N  
  作者姓名: XINGPING N%bv.M  
  编写时间: 2004-05-23 p &q=}O  
  输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405 q ':C"7A  
  返 回 值:整型值,包含的工作日数目。 Vx'54X  
  算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。    M2N5D#  
  ----------------------------------------------------------------------------------------*/ Ksdd:!m7  
   Result INTEGER := 0; 2[RmY   
   myts INTEGER;   --所给年月的天数 Nj76uB~%d5  
   scts INTEGER;   --某天距2001-12-30所差的天数 Bj"po$rbR  
   rq  DATE; ]K~! B5nrn  
   djt INTEGER := 1;  -- ;jJJ@[\Q  
  BEGIN 0I<u}\dsf  
   myts := to_char(last_day(to_date(ny,'yyyymm')),'dd');  0V+}-  
   LOOP *\ t9qv;qu  
    rq := TO_date(ny||substr(100+djt,2),'yyyymmdd'); "[_*(&.q  
    scts := rq - to_date('2001-12-30','yyyy-mm-dd'); o}!? /n#  
    IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN $Wut`}T  
     Result := Result + 1; #b.4 V,n  
    END IF; BU2hb  
    djt := djt + 1;  @Jg3-d]  
    EXIT WHEN djt>myts; !$e1G.aG  
   END LOOP;  Q\jrl #64  
   RETURN Result;  ?=Ob]/FM  
  END Get_WorkingDays;

本贴标签:
顶端 Posted:2007-06-07 13:43 | [楼 主]

 赛迪网技术社区 -> Oracle
快速发帖 顶端
内容
HTML 代码不可用

使用签名
Wind Code自动转换

字数检查 恢复数据
按 Ctrl+Enter 直接提交
表情 [更多]