强大的PLSQL - 计算两个日期之间的工做日天数-除去(周末和公共假日

 


用php写了一个函数,实现的功能是 计算两个日期之间的工做日天数-除去(周末和公共假日)写了 300多行的代码,  实现公共假日从文件中读取, 或者从数据库提取, 而后传入两个日期,就能返回想要的结果, 无奈之下想到了PLSQL, 同事几分钟后给我一段简短的代码. 着实让我吃了一惊..

下面是代码:
CREATE OR REPLACE FUNCTION calcDates(START_DATE IN DATE, END_DATE IN DATE)
  RETURN number IS
  No_of_DAYS number;
BEGIN

  IF START_DATE < END_DATE THEN
    SELECT count(1) days
      INTO NO_OF_DAYS
      FROM (SELECT DISTINCT trunc(START_DATE) + level - 1 dayList
              FROM dual
            connect BY trunc(START_DATE) + level - 1 < = trunc(END_DATE)) A
     where not exists (select 1
              from dp_tbl_public_holiday b
             where to_date(b.ph_date, 'YYYYMMDD') = A.dayList)
       and to_char(dayList, 'D') not in (1, 7);
  ELSE
    SELECT 0 - count(1) days
      INTO NO_OF_DAYS
      FROM (SELECT DISTINCT trunc(END_DATE) + level - 1 dayList
              FROM dual
            connect BY trunc(END_DATE) + level - 1 < = trunc(START_DATE)) A
     where not exists (select 1
              from dp_tbl_public_holiday b
             where to_date(b.ph_date, 'YYYYMMDD') = A.dayList)
       and to_char(dayList, 'D') not in (1, 7);
  END IF;

  Return No_of_DAYS;
END;

注释:
1.dp_tbl_public_holiday
  存储着 假期的性息, ph_date 假期的日期.
2.to_char(dayList, 'D') not in (1, 7);
  这个强大的 to_char(dayList, 'D')返回的是 日期是星期几,就比如是java里面的 Calendar.DAY_OF_WEEK,
  not in (1, 7)就是不在周六或者周日, 1是周日, 7是周六 ,这个和java同样.
3.trunc(START_DATE) trunc 函数拿到的是日期的值,忽略小时数.

4.SELECT DISTINCT trunc(START_DATE) + level - 1 dayList 
  FROM dual 
  connect BY trunc(START_DATE) + level - 1 < = trunc(END_DATE)
  这段代码就是列出两个日期之间全部日期. connect by 和 level 是个深奥的东东.须要好好消化`

就这样, 先后不到30行的代码, 解决了问题!!
!php

相关文章
相关标签/搜索