| 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 |
| 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 |
/*----------------------------------------------------------------------------------------- Result INTEGER := 0;
函数名称: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(即不是星期六和星期天),则算一个工作日。
----------------------------------------------------------------------------------------*/
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;

