您当前的位置: 首页 > 数据库教程 > Oracle教程 > Oracle数据库中每月工作日计算代码分析

Oracle数据库中每月工作日计算代码分析

作者:guanchaofeng 来源:不详 发布时间: 2009-07-10 18:35 点击:
SQLSELECTTEXTFROMUSER_SOURCEWHERETYPE='PROCEDURE'ANDNAME='GZR'; TEXT ---------------------------------------------------------------------------------------------------- proceduregzr(v_nowdateinvarchar2)as v_firstsaturdayvarchar2(10); v_ou

Oracle数据库中每月工作日计算代码分析

  SQL>SELECTTEXTFROMUSER_SOURCEWHERETYPE='PROCEDURE'ANDNAME='GZR';
  
  TEXT
  
  ----------------------------------------------------------------------------------------------------
  
  proceduregzr(v_nowdateinvarchar2)as
  
  v_firstsaturdayvarchar2(10);
  
  v_outdatedate;
  
  v_countworkdaynumber(10);
  
  begin
  
  selectto_char(next_day(to_date(concat(v_nowdate,'01'),'yyyymmdd'),1)-1,'dd')
  
  intov_firstsaturday
  
  fromsys.dual;
  
  v_countworkday:=to_number(v_firstsaturday)-1;
  
  loop
  
  v_outdate:=to_date(concat(v_nowdate,v_firstsaturday+7),'yyyymmdd');
  
  ifv_outdateyyymm'),'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'));
  
  endif;
  
  exitwhenv_outdate>=to_date(concat(to_char(add_months(sysdate,1),'yyyymm'),'01'),'yyyymmdd');
  
  TEXT
  
  CREATEORREPLACEFUNCTIONGet_WorkingDays(
  
  nyINVARCHAR2
  
  )RETURNINTEGERIS
  
  /*------------------------------------------------------------------------------------------
  
  函数名称: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).过滤掉结果集兄滴?和6的元素,然后求count,所得即为工作日数目。
  
  -------------------------------------------------------------------------------------------------*/
  
  ResultINTEGER;
  
  BEGIN
  
  SELECTCOUNT(*)INTOResult
  
  FROM(SELECTMOD(MOD(q.rq-to_date('2001-12-30','yyyy-mm-dd'),7),7)weekday
  
  FROM(SELECTto_date(ny||t.dd,'yyyymmdd')rq
  
  FROM(SELECTsubstr(100+ROWNUM,2,2)dd
  
  FROMljrqzWHERERownum<=31
  
  )t
  
  WHEREto_date(ny||t.dd,'yyyymmdd')
  
  BETWEENto_date(ny,'yyyymm')
  
  ANDlast_day(to_date(ny,'yyyymm'))
  
  )q
  
  )a
  
  WHEREa.weekdayNOTIN(0,6);
  
  RETURNResult;
  
  ENDGet_WorkingDays;
  
  CREATEORREPLACEFUNCTIONGet_WorkingDays(
  
  nyINVARCHAR2
  
  )RETURNINTEGERIS
  
  /*-----------------------------------------------------------------------------------------
  
  函数名称: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(即不是星期六和星期天),则算一个工作日。
  
  ----------------------------------------------------------------------------------------*/
  
  ResultINTEGER:=0;
  
  mytsINTEGER;--所给年月的天数
  
  sctsINTEGER;--某天距2001-12-30所差的天数
  
  rqDATE;
  
  djtINTEGER:=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');
  
  IFMOD(MOD(scts,7)+7,7)NOTIN(0,6)THEN
  
  Result:=Result+1;
  
  ENDIF;
  
  djt:=djt+1;
  
  EXITWHENdjt>myts;
  
  ENDLOOP;
  
  RETURNResult;
  
  ENDGet_WorkingDays;

分享到:
本文"Oracle数据库中每月工作日计算代码分析"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4