CREATE OR REPLACE FUNCTION Get_WorkingDays( ny IN VARCHAR ) RETURN INTEGER IS /* 函数名称Get_WorkingDays 中文名称求某一年月中共有多少工作日 作者姓名: XINGPING 编写时间: 输入参数NY:所求包含工作日数的年月格式为yyyymm如 返 回 值整型值包含的工作日数目 算法描述 )列举出参数给出的年月中的每一天这里使用了一个表(ljrq是我的库中的一张表这个表可以是有权访问的记录条数至少为的任意一张表或视图)来构造出某年月的每一天 )用这些日期和一个已知星期几的日期相减(是星期天)所得的差再对求模如果所求年月在以前那么所得的差既是负数求模后所得值范围为大于小于如表示星期六故先将求模的结果加再求的模 )过滤掉结果集中值为和的元素然后求count所得即为工作日数目 */ Result INTEGER; BEGIN SELECT COUNT(*) INTO Result FROM (SELECT MOD(MOD(qrqto_date(yyyymmdd))) weekday FROM ( SELECT to_date(ny||tddyyyymmdd) rq FROM (SELECT substr(+ROWNUM) dd FROM ljrq z WHERE Rownum<= ) t WHERE to_date(ny||tddyyyymmdd) BETWEEN to_date(nyyyyymm) AND last_day(to_date(nyyyyymm)) )q ) a WHERE aweekday NOT IN(); RETURN Result; END Get_WorkingDays; ___________________________________ 还有一个版本 CREATE OR REPLACE FUNCTION Get_WorkingDays( ny IN VARCHAR ) RETURN INTEGER IS /* 函数名称Get_WorkingDays 中文名称求某一年月中共有多少工作日 作者姓名: XINGPING 编写时间: 输入参数NY:所求包含工作日数的年月格式为yyyymm如 返 回 值整型值包含的工作日数目 算法描述使用Last_day函数计算出参数所给年月共包含多少天根据这个值来构造一个循环在这个循环中先求这个月的每一天与一个已知是星期天的日期(是星期天)的差所得的差再对求模如果所求日期在以前那么所得的差既是负数求模后所得值范围为大于小于如表示星期六故先将求模的结果加再求的模 如过所得值不等于和(即不是星期六和星期天)则算一个工作日 */ Result INTEGER := ; myts INTEGER;所给年月的天数 scts INTEGER;某天距所差的天数 rq DATE; djt INTEGER := ; BEGIN myts := to_char(last_day(to_date(nyyyyymm))dd); LOOP rq := TO_date(ny||substr(+djt)yyyymmdd); scts := rq to_date(yyyymmdd); IF MOD(MOD(scts)+) NOT IN() THEN Result := Result + ; END IF; djt := djt + ; EXIT WHEN djt>myts; END LOOP; RETURN Result; END Get_WorkingDays; 以上两个版本的比较 第一个版本一条SQL语句就可以得出结果不需要编程就可以达到目的但需要使用任意一张有权访问的记录条数至少为的一张表或视图 第二个版本需要编程但不需要表或者视图 这两个版本都还存在需要完善的地方即没有考虑节日如五一十一元旦春节这些节假期都没有去除这些节假日应该维护成一张表然后通过查表来去除这些节假日 |