Sql计算两个日期之间的天数,不包括周末和假期表中的日期

时间:2015-02-23 21:10:52

标签: sql oracle11g

我是Oracle Sql开发人员(11g)的新手。我被要求恢复添加日期和当前sysdate之间的工作日数。总天数应将周末以及日历表中列出的日期排除为假日。以下是表格的样本:

Process Request 
ID  Added_date
1   20-Feb-15
2   12-Dec-14
3   11-Nov-14

假期表:

Holiday_date
1-Jan-15
19-Jan-15
16-Feb-15

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个(有点)复杂的问题,至少据我所知,因为你必须检索给定日期范围内的所有日期,然后检查每个日期以查看它是周末日还是周日是假日。以下是我将如何做到这一点:

WITH d1 AS (
    SELECT id, added_date
         , added_date + LEVEL AS range_date
      FROM process_request
   CONNECT BY added_date + LEVEL < TRUNC(SYSDATE+1)
       AND PRIOR id = id
       AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
)
SELECT d1.id, d1.added_date, TRUNC(SYSDATE), COUNT(*) AS business_day_cnt
  FROM d1
 WHERE TO_CHAR(d1.range_date) NOT IN ('SAT','SUN')
   AND NOT EXISTS ( SELECT 1 FROM holiday_table ht
                     WHERE TRUNC(ht.holiday_date) = TRUNC(d1.range_date) )
 GROUP BY d1.id, d1.added_date
 ORDER BY id

我会把一个SQL小提琴放在一起,但我现在遇到连接问题。在我们的CTE(d1)中,我使用CONNECT BYLEVEL来获取added_date和今天的日期之间的所有日期(包括今天的日期,但不是added_date })。然后我按所有这些日期id计算,不包括周末天数以及与HOLIDAY_TABLE中给出的日期相对应的天数。

更新 - SQL Fiddle Here