如何通过比较两个表来获得工作日数?
Posted
技术标签:
【中文标题】如何通过比较两个表来获得工作日数?【英文标题】:How can I get the number of working days by comparing two tables? 【发布时间】:2021-04-22 08:50:20 【问题描述】:我目前有 3 个表,一个存储任务详细信息的表,一个存储人员详细信息的表和任务分配如下。
任务
TASK_ID | TASK_START_DATE | TASK_END_DATE |
---|---|---|
001 | 03-04-2021 | 05-04-2021 |
002 | 05-04-2021 | 07-04-2021 |
员工
STAFF_ID | STAFF_WORK_DAY |
---|---|
1001 | MONDAY, WEDNESDAY, FRIDAY |
1002 | MONDAY, TUESDAY |
TASK_ASSIGNMENT
STAFF_ID | TASK_ID |
---|---|
1001 | 001 |
1002 | 002 |
我提取了每个任务的日期并使用 TO_CHAR 将它们转换为工作日名称
TASK_ID | DATE |
---|---|
001 | SATURDAY |
001 | SUNDAY |
001 | MONDAY |
002 | MODNDAY |
002 | TUESDAY |
002 | WEDNESDAY |
如何比较表格并找出每个任务在其持续时间内的工作日数?
预期结果
TASK_ID | STAFF_ID | COUNT(WORK_DAY) |
---|---|---|
001 | 1001 | 1 |
002 | 1002 | 2 |
【问题讨论】:
您能否添加您期望的输出结果? 我已经把桌子放在那里了。例如。 STAFF 1002 在周一和周二工作。所以在 TASK 002 的持续时间内,会有 2 个工作日。 我会考虑一个单独的 staff_works 表,每个员工每个工作日有一行。 【参考方案1】:你可以使用:
WITH days ( id, day ) AS (
SELECT 0, 'MONDAY' FROM DUAL UNION ALL
SELECT 1, 'TUESDAY' FROM DUAL UNION ALL
SELECT 2, 'WEDNESDAY' FROM DUAL UNION ALL
SELECT 3, 'THURSDAY' FROM DUAL UNION ALL
SELECT 4, 'FRIDAY' FROM DUAL UNION ALL
SELECT 5, 'SATURDAY' FROM DUAL UNION ALL
SELECT 6, 'SUNDAY' FROM DUAL
)
SELECT t.task_id,
s.staff_id,
COUNT(*)
FROM staff s
INNER JOIN days d
ON ( s.staff_work_day LIKE '%' || d.day || '%' )
INNER JOIN task_assignment ta
ON ( ta.staff_id = s.staff_id )
INNER JOIN tasks t
ON ( ta.task_id = t.task_id )
INNER JOIN LATERAL (
SELECT t.TASK_START_DATE + LEVEL - 1 AS task_day
FROM DUAL
CONNECT BY LEVEL <= t.TASK_END_DATE - t.TASK_START_DATE + 1
) td
ON ( td.task_day - TRUNC( td.task_day, 'IW' ) = d.id )
GROUP BY t.task_id, s.staff_id
其中,对于样本数据:
CREATE TABLE tasks ( TASK_ID, TASK_START_DATE, TASK_END_DATE ) AS
SELECT '001', DATE '2021-04-03', DATE '2021-04-05' FROM DUAL UNION ALL
SELECT '002', DATE '2021-04-05', DATE '2021-04-07' FROM DUAL;
CREATE TABLE STAFF( STAFF_ID, STAFF_WORK_DAY ) AS
SELECT 1001, 'MONDAY, WEDNESDAY, FRIDAY' FROM DUAL UNION ALL
SELECT 1002, 'MONDAY, TUESDAY' FROM DUAL;
CREATE TABLE TASK_ASSIGNMENT( STAFF_ID, TASK_ID ) AS
SELECT 1001, '001' FROM DUAL UNION ALL
SELECT 1002, '002' FROM DUAL;
输出:
TASK_ID STAFF_ID COUNT(*) 002 1002 2 001 1001 1
db小提琴here
【讨论】:
原来没有选择行 @WayneSum 请edit 提出minimal reproducible example 的问题,其中包括针对您的表的 DDL (CREATE TABLE
) 语句和针对您的样本数据的 DML (INSERT
) 语句,以便我们可以复制问题。如您所见,我的查询适用于 dbfiddle,并且仅说明“未选择任何行”并不能帮助我们调试问题,因为我们无法复制您所做的事情。以上是关于如何通过比较两个表来获得工作日数?的主要内容,如果未能解决你的问题,请参考以下文章