网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  两种方法分析每月工作日计算程序     
  文章作者:未知  文章来源:未知  
  查看:199次  录入:管理员--2007-06-10  
  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;

 
 
上一篇: 不要忽视Oracle 10g STATSPACK新功能    下一篇: 深入研究Oracle数据库中空间管理的方法
  相关文档
oracle数据库删除表中重复记录的常见方法 08-04
借助两个开发包在pl/sql中实现多进程通信 06-20
带你轻松接触多线索机制概念 09-29
如何让oracle数据库始终保持优良性能 04-29
视图上含有row_number分析函数没法走索引 03-10
讲解oracle数据库10g新特性中的闪回查询 05-12
[Oracle]一次数据库性能问题的tuning 08-05
通过Backup Exec实施Oracle来灾难恢复 05-27
详细讲解oracle数据库中不同的恢复特性 04-11
RMAN备份恢复——配置介质管理器 06-03
Oracle中用脚本跟踪存储过程实例讲解 04-11
从多个方面详细讲解sqlplus的使用技巧 (1) 03-04
oracle存储过程及table表用pl/sql备份还原 08-16
未来的数据库将构筑在网格计算的环境之上 02-18
深入了解缓冲日志文件i/o重要性能问题 04-16
实例讲解分区表的可用性及相关错误案例 (1) 03-31
帮你完全了解 Oracle 标签安全测试 05-13
Oracle外部程序的触发小结 05-27
清除Oracle中无用索引 改善DML性能 04-11
Oracle中如何实现某一字段自动增加1 01-15
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息