如何通过比较两个表来获得工作日数?

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,并且仅说明“未选择任何行”并不能帮助我们调试问题,因为我们无法复制您所做的事情。

以上是关于如何通过比较两个表来获得工作日数?的主要内容,如果未能解决你的问题,请参考以下文章

在Python中动态计算不包括假期日历的工作日数

Excel 两个日期之间间隔的工作日数,非头尾,大家帮我看看我这样做,结果不对呀?问题出在哪了?不甚感激!

通过比较两个表来更新 SQL 查询

如何计算确定日期的工作日数?

如何使用 Moment JS 计算范围之间的给定工作日数?

SQL工作日查询