两种方法分析每月工作日计算程序
SQL> SELECT TEXT FROM USER_SOURCE WHERE TYPE='PROCEDURE' AND NAME='GZR'; 0j.q$i<Sm *g@BfC:C TEXT QaCPC" ---------------------------------------------------------------------------------------------------- Y>p7 procedure gzr(v_nowdate in varchar2) as aaCP<D= v_firstsaturday varchar2(10); D{&Og-cX v_outdate date; td#;aM6 v_countworkday number(10); 3)7u begin )D>8QY7 select to_char(next_day(to_date(concat(v_nowdate,'01'),'yyyymmdd'),1)-1,'dd') 6 zE 5Y into v_firstsaturday E` ]q8 from sys.dual; 2 ";4<7r, v_countworkday:=to_number(v_firstsaturday)-1; beih#2QS loop a[aYV,3i#b v_outdate:=to_date(concat(v_nowdate,v_firstsaturday+7),'yyyymmdd'); % K7Ky if v_outdate yyymm'),'01'),'yyyymmdd') then +pPJ&7 @H[07}r v_countworkday:=v_countworkday+5;
rpI)z5" else J!6t)s8 v_countworkday:=v_countworkday+5-to_number(v_outdate-to_date(concat(to_char(add_months(sysdate zCgp 6"V ,1),'yyyymm'),'01'),'yyyymmdd')); ^/1>2$-^4: QiEL&` end if; O49J{
|
K exit when v_outdate>=to_date(concat(to_char(add_months(sysdate,1),'yyyymm'),'01'),'yyyymmdd'); (lK$X3o4v) ){VjQ9c<6 TEXT 8A"eGrj"Ai 6-F\8I@)j CREATE OR REPLACE FUNCTION Get_WorkingDays( F g&(P F ny IN VARCHAR2 =s28nR< ) RETURN INTEGER IS HA>?IjX_ /*------------------------------------------------------------------------------------------ /B~Y 8 函数名称:Get_WorkingDays \Jg%J
_K 中文名称:求某一年月中共有多少工作日 n}kch dxY 作者姓名: XINGPING }~{:28>FC" 编写时间: 2004-05-22 9y/[V{- 输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405 /!w~\jB 返 回 值:整型值,包含的工作日数目。 ^y @i}H 算法描述: sp7%FJStk 1).列举出参数给出的年月中的每一天。这里使用了一个表(ljrq是我的库中的一张表。这个表可以是有权访问的、记录条数至少为31的任意一张表或视图)来构造出某年月的每一天。 |1g7>:zJ 2).用这些日期和一个已知星期几的日期相减(2001-12-30是星期天),所得的差再对7求模。如果所求年月在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. W$x
iJ';# 3).过滤掉结果集中值为0和6的元素,然后求count,所得即为工作日数目。 L; HJ@ -------------------------------------------------------------------------------------------------*/ )/6d$P_"AJ Result INTEGER; ,|gmQ}W BEGIN N >PQ!t3 SELECT COUNT(*) INTO Result -vO8\O01D FROM (SELECT MOD(MOD(q.rq-to_date('2001-12-30','yyyy-mm-dd'),7),7) weekday 7@pHVhT FROM ( SELECT to_date(ny||t.dd,'yyyymmdd') rq 'O1,R;u! FROM (SELECT substr(100+ROWNUM,2,2) dd z= LGR FROM ljrq z WHERE Rownum<=31 -t(?j%ZR ) t RT}pd[UQkz WHERE to_date(ny||t.dd,'yyyymmdd') ek pRP BETWEEN to_date(ny,'yyyymm') cgbwA AND last_day(to_date(ny,'yyyymm')) 1&Q]F )q s8]}y06PS ) a W^!y* WHERE a.weekday NOT IN(0,6); ;u` XWb
RETURN Result; ?)#/TQ END Get_WorkingDays; XdJ(mN F
[!p^|A CREATE OR REPLACE FUNCTION Get_WorkingDays( ,F\:8,ixT/ ny IN VARCHAR2 =MC0m8oyD ) RETURN INTEGER IS ~a7i
#t1 /*----------------------------------------------------------------------------------------- :D$PC] V] 函数名称:Get_WorkingDays wUJd-,! 中文名称:求某一年月中共有多少工作日 a/Wuv 'N 作者姓名: XINGPING N%bv.M 编写时间: 2004-05-23 p &q=}O 输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405 q
':C"7A 返 回 值:整型值,包含的工作日数目。 Vx'54X 算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。 M2N5D# ----------------------------------------------------------------------------------------*/ Ksdd:!m7 Result INTEGER := 0; 2[RmY myts INTEGER; --所给年月的天数 Nj76uB~%d5 scts INTEGER; --某天距2001-12-30所差的天数 Bj"po$rbR rq DATE; ]K~!
B5nrn djt INTEGER := 1; -- ;jJJ@[\Q BEGIN 0I<u}\dsf myts := to_char(last_day(to_date(ny,'yyyymm')),'dd'); 0V+}- LOOP *\
t9qv;qu rq := TO_date(ny||substr(100+djt,2),'yyyymmdd'); "[_*(&.q scts := rq - to_date('2001-12-30','yyyy-mm-dd'); o}!?
/n# IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN $Wut`}T Result := Result + 1; #b.4
V,n END IF; BU2hb djt := djt + 1; @J g3-d] EXIT WHEN djt>myts; !$e1G.aG END LOOP; Q\jrl
#64 RETURN Result; ?=Ob]/FM END Get_WorkingDays;
|