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

王朝oracle·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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');

ifv_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).过滤掉结果集兄滴?和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(nyt.dd,'yyyymmdd') rq

FROM (SELECT substr(100+ROWNUM,2,2) dd

FROM ljrq z WHERE Rownum<=31

) t

WHERE to_date(nyt.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(nysubstr(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;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航