我是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
感谢。
答案 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 BY
和LEVEL
来获取added_date
和今天的日期之间的所有日期(包括今天的日期,但不是added_date
})。然后我按所有这些日期id
计算,不包括周末天数以及与HOLIDAY_TABLE
中给出的日期相对应的天数。
更新 - SQL Fiddle Here