如何解决使用 SQL Oracle 11GR2 从日期范围计算净和重叠小时数
我正在尝试计算给定员工和项目的每天净小时数。 员工一天工作时间不得超过 24 小时。因此,需要计算一天的净小时数以及重叠的小时数。 我设计了一个部分解决方案,但是当任务的结束日期时间在给定日期相同时,这不起作用。我需要帮助解决计算给定日期的净小时数、重叠小时数的问题。
SELECT
person_id,start_time,end_time,project_id,mandatory_work,round((end_time - start_time) * 24,2) hours,round((end_time - start_time) * 24 -
greatest((end_time - greatest(start_time,nvl(LAG(end_time)
OVER(PARTITION BY person_id,mandatory_work
ORDER BY mandatory_work DESC,start_time ASC,end_time DESC),start_time))) * 24,0),2) overlap_hrs,round(greatest((end_time - greatest(start_time,nvl(LAG(end_time)
OVER(PARTITION BY person_id,mandatory_work ORDER BY mandatory_work DESC,2)
net_hrs
FROM
mytable
ORDER BY
person_id,mandatory_work DESC,end_time DESC;
表定义如下
CREATE TABLE "MYTABLE"
( "PERSON_ID" NUMBER,"EVENT_DATE" CHAR(9),"START_TIME" DATE,"END_TIME" DATE,"PROJECT_ID" VARCHAR2(9),"MANDATORY_WORK" CHAR(1)
)
REM INSERTING into MYTABLE
SET DEFINE OFF;
Insert into MYTABLE (PERSON_ID,EVENT_DATE,START_TIME,END_TIME,PROJECT_ID,MANDATORY_WORK) values (1111,'01-JUN-21',to_date('01-06-2021 18:00:00','DD-MM-YYYY HH24:MI:SS'),to_date('02-06-2021 08:00:00','AAA','Y');
Insert into MYTABLE (PERSON_ID,'02-JUN-21',to_date('02-06-2021 03:00:00',to_date('02-06-2021 04:00:00','BBB',to_date('02-06-2021 06:16:00',to_date('02-06-2021 07:00:00','CCC','03-JUN-21',to_date('02-06-2021 10:00:00',to_date('02-06-2021 10:15:00','DDD',to_date('02-06-2021 10:30:00',to_date('02-06-2021 11:15:00','EEE',to_date('03-06-2021 11:00:00',to_date('03-06-2021 15:00:00',to_date('01-06-2021 17:59:00',to_date('02-06-2021 08:01:00','N');
Insert into MYTABLE (PERSON_ID,MANDATORY_WORK) values (2222,to_date('02-06-2021 18:00:00',to_date('03-06-2021 08:00:00',to_date('03-06-2021 01:00:00',to_date('03-06-2021 10:00:00',to_date('02-06-2021 17:59:00',to_date('03-06-2021 07:49:00',to_date('02-06-2021 05:00:00',to_date('02-06-2021 07:15:00',MANDATORY_WORK) values (3333,'03-Jun-21',to_date('03-06-2021 14:00:00',to_date('03-06-2021 21:59:59','TESTING',to_date('03-06-2021 14:37:46',to_date('03-06-2021 14:42:46',to_date('03-06-2021 15:35:08',to_date('03-06-2021 18:08:46',to_date('03-06-2021 18:13:46','Y');
所需的输出如下。我们应该在 net_hrs 的第二行看到“0”而不是 6.41。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。