游戏梦网
当前位置:IT学院 >> 数据库 >> Oracle >> 正文

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

中关村商情网  2007-7-5  责编:夏天  字体:
  SQL> SELECT TEXT FROM USER_SOURCE WHERE TYPE='PROCEDURE' AND NAME='GZR';
  
  TEXT                                                
  ----------------------------------------------------------------------------------------------------
  procedure gzr(v_nowdate in varchar2) as                              
  v_firstsaturday varchar2(10);                                   
  v_outdate date;                                          
  v_countworkday number(10);                                     
  begin                                               
        select to_char(next_day(to_date(concat(v_nowdate,'01'),'yyyymmdd'),1)-1,'dd')         
       into v_firstsaturday                                      
       from sys.dual;                                         
   v_countworkday:=to_number(v_firstsaturday)-1;                          
   loop                                               
    v_outdate:=to_date(concat(v_nowdate,v_firstsaturday+7),'yyyymmdd');              
    if v_outdate yyymm'),'01'),'yyyymmdd') then                                   
                                                    
     v_countworkday:=v_countworkday+5;                              
     else                                             
     v_countworkday:=v_countworkday+5-to_number(v_outdate-to_date(concat(to_char(add_months(sysdate
  ,1),'yyyymm'),'01'),'yyyymmdd'));                                 
                                                    
    end if;                                            
   exit when v_outdate>=to_date(concat(to_char(add_months(sysdate,1),'yyyymm'),'01'),'yyyymmdd');  
  
  TEXT
  
  CREATE OR REPLACE FUNCTION Get_WorkingDays(
   ny IN VARCHAR2
  ) RETURN INTEGER IS

  
  /*------------------------------------------------------------------------------------------
  函数名称:Get_WorkingDays
  中文名称:求某一年月中共有多少工作日
  作者姓名: XINGPING
  编写时间: 2004-05-22
  输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
  返 回 值:整型值,包含的工作日数目。
  算法描述:
    1).列举出参数给出的年月中的每一天。这里使用了一个表(ljrq是我的库中的一张表。这个表可以是有权访问的、记录条数至少为31的任意一张表或视图)来构造出某年月的每一天。
    2).用这些日期和一个已知星期几的日期相减(2001-12-30是星期天),所得的差再对7求模。如果所求年月在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模.
    3).过滤掉结果集中值为0和6的元素,然后求count,所得即为工作日数目。   
  -------------------------------------------------------------------------------------------------*/
   Result INTEGER;
  BEGIN
   SELECT COUNT(*) INTO Result
    FROM (SELECT MOD(MOD(q.rq-to_date('2001-12-30','yyyy-mm-dd'),7),7) weekday
        FROM ( SELECT to_date(ny||t.dd,'yyyymmdd') rq
             FROM (SELECT substr(100+ROWNUM,2,2) dd
                 FROM ljrq z WHERE Rownum<=31
               ) t
             WHERE to_date(ny||t.dd,'yyyymmdd')
              BETWEEN to_date(ny,'yyyymm')
                AND last_day(to_date(ny,'yyyymm'))
           )q
       ) a 
    WHERE a.weekday NOT IN(0,6);  
   RETURN Result; 
  END Get_WorkingDays;
  
  CREATE OR REPLACE FUNCTION Get_WorkingDays(
   ny IN VARCHAR2
  ) RETURN INTEGER IS

  /*-----------------------------------------------------------------------------------------
  函数名称:Get_WorkingDays
  中文名称:求某一年月中共有多少工作日
  作者姓名: XINGPING
  编写时间: 2004-05-23
  输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
  返 回 值:整型值,包含的工作日数目。
  算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。   
  ----------------------------------------------------------------------------------------*/

   Result INTEGER := 0;
   myts INTEGER;   --所给年月的天数
   scts INTEGER;   --某天距2001-12-30所差的天数
   rq  DATE;
   djt INTEGER := 1;  --
  BEGIN
   myts := to_char(last_day(to_date(ny,'yyyymm')),'dd'); 
   LOOP
    rq := TO_date(ny||substr(100+djt,2),'yyyymmdd');
    scts := rq - to_date('2001-12-30','yyyy-mm-dd');
    IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN
     Result := Result + 1;
    END IF;
    djt := djt + 1; 
    EXIT WHEN djt>myts;
   END LOOP; 
   RETURN Result; 
  END Get_WorkingDays;

【作者:佚名】 【来源:中关村商情网】
评论】【 】【去论坛看看】【收藏】【打印】【关闭】【回到顶部

我来说两句

优惠活动:买笔记本、台式机、服务器,拨打电话010-68400280/68400215,享受惊喜特价!

论坛·美图

相关链接
IT学院 最新文章

HD Tune硬盘软件

服务器负载均衡

Oracle数据库

ASP加密和解密
·Mac OS X下应用程序的安装与卸载
·成为系统专家的必修课
·X系统不能启动故障排除的DIY完全手册
·认识苹果电脑的必备常识
·苹果操作系统精选教程1
·苹果操作系统精选教程2
·苹果操作系统精选教程3
·苹果操作系统精选教程4
·苹果操作系统精选教程5
·苹果操作系统精选教程6
·苹果操作系统精选教程7
·MAC系统的一些常识
·APPLE Mac osx (提速 / 修改键盘设置 
·APPLE 全功略 (一)
·APPLE Mac OSX工具软件下载
·在PC上本地安装Macl OS X x86
·MAC X86 硬件支持列表
·xp 与osx 双启动
·在PC上安装Mac OSX x86
·Mac OSX建立分区和格式化分区
IT学院 热点文章

关于CZN | 用户注册 | 友情链接 | 内容合作 | 广告服务 | 免责条款 | 工作机会 | 我要投稿 | 产品评测 | 联系CZN | 网站地图 | 设为首页 | 加入收藏
服务热线:010-68400280 EMAIL: 您若发现页面中有任何错误或侵犯您的版权,请及时与我们联系
Copyright© 2005-2008 Czn.Com.Cn All Rights Reserved 京ICP证05009081号