2013-12-10 31 views
0

我有两个表格。一个带有某些工作的开始日期和结束日期,另一个带有移动时间表。这是移表的结构在oracle中计算移位时间

作业表

Job_ID   Start_Time   End_Time 
1   01.12.2013 16:38:56  09.12.2013 10:38:56 
2   11.11.2013 10:14:13  07.12.2013 12:28:26 
3   29.11.2013 08:20:22  05.12.2013 07:18:17 

移位数据表

Start  End  Day 
    0:00 6:00:00 Monday 
6:00:00 12:00:00 Monday 
12:00:00 0:00:00 Tuesday 
0:00:00 6:00:00 Wednesday 
6:00:00 12:00:00 Saturday 
6:00:00 12:00:00 Sunday 

预期输出

Job_ID   Start_Time   End_Time    Shift Timings 
1   01.12.2013 16:38:56  09.12.2013 10:38:56  1 18:00:00 

例如:从'01 .12.2013 16:38:56'开始工作直到'09 .12.2013 10:38:56'关闭,总共有42小时的换班时间(以间隔计算值)根据插槽表。我希望我的要求清楚。

对于具有开始时间和结束时间的每行Job条目,我需要计算涉及多少Shift时间。

+0

请发表您的尝试。 – Oyeme

+0

也发布表格和期望输出的样本数据。 – Noel

+0

“从'01.12.2013 16:38:56'开始工作直到'09.12.2013 10:38:56'关闭,总共有42小时轮班时间” - 你确定这个吗? ?这两个日期之间的间隔时间要多于42小时。 –

回答

0

一个解决这个问题是:

1)作业是一个时间间隔,你需要生成1元组的每一天。如果一项工作从今天开始到明天结束,您需要2个元组(今天和明天)。你可以这样做:

SELECT JOBID, 
    GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) JOBDAYSTART, 
    LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD')) JOBDAYEND, 
    NDAY 
FROM (
    SELECT LEVEL NDAY 
    FROM DUAL 
    CONNECT BY LEVEL <= (SELECT CEIL(MAX(JOBEND - JOBSTART))+1 FROM JOBS) 
    ), JOBS 
WHERE GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) <= 
    LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD')) 

2)你必须修复SHIFT表(截至上一些时间的元组0:00:00,这是第二天小时)。您可以使用:

SELECT SHIFTSTART, SHIFTEND, DAY, 0 SHIFTENDOFFSET 
FROM SHIFTS 
WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') 
    <= TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') 
UNION 
SELECT SHIFTSTART, SHIFTEND, DAY, 1 SHIFTENDOFFSET 
FROM SHIFTS 
WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') 
    > TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') 

这个选择包括SHIFTENDOFFSET :0如果小时在开始的第一天则为1小时是在开始日复一日。

3)现在你可以在作业开始时加入使用转移之日的“每一份工作一天”天都,并筛选不可能元组(那些日子移位结束后)

SELECT JOBID, 
    GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART), 
    LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND), 
    24*(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)) TOTAL 
FROM 
    (SELECT JOBID, GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) JOBDAYSTART, LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD')) JOBDAYEND, NDAY FROM (SELECT LEVEL NDAY FROM DUAL CONNECT BY LEVEL <= (SELECT CEIL(MAX(JOBEND - JOBSTART))+1 FROM JOBS)), JOBS wHERE GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) <= LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD'))) 
    JOIN 
    (SELECT SHIFTSTART, SHIFTEND, DAY, 0 SHIFTENDOFFSET FROM SHIFTS WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') <= TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') UNION SELECT SHIFTSTART, SHIFTEND, DAY, 1 SHIFTENDOFFSET FROM SHIFTS WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') > TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS')) 
    ON (TO_CHAR(JOBDAYSTART, 'Day','nls_date_language=english') LIKE (DAY||'%')) 
WHERE LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) 
    > GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART) 
ORDER BY 1,2 

4 )由JOBID和SUM组获得总小时数。

SELECT JOBID, 
    24*SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)) TOTAL 
FROM 
    (SELECT JOBID, GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) JOBDAYSTART, LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD')) JOBDAYEND, NDAY FROM (SELECT LEVEL NDAY FROM DUAL CONNECT BY LEVEL <= (SELECT CEIL(MAX(JOBEND - JOBSTART))+1 FROM JOBS)), JOBS WHERE GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) <= LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD'))) 
    JOIN 
    (SELECT SHIFTSTART, SHIFTEND, DAY, 0 SHIFTENDOFFSET FROM SHIFTS WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') <= TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') UNION SELECT SHIFTSTART, SHIFTEND, DAY, 1 SHIFTENDOFFSET FROM SHIFTS WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') > TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS')) 
    ON (TO_CHAR(JOBDAYSTART, 'Day','nls_date_language=english') LIKE (DAY||'%')) 
WHERE LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) > GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART) 
GROUP BY JOBID 

5)最后,应用您期望的输出格式:

SELECT JOBID "Job_ID", JOBSTART "Start_Time", JOBEND "End_Time", TRUNC(SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)))||' '|| TO_CHAR(TRUNC(MOD(SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)),1)*24),'FM00')||':'|| TO_CHAR(TRUNC(MOD(MOD(SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)),1)*24,1)*60),'FM00')||':'|| TO_CHAR(TRUNC(MOD(MOD(MOD(SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)),1)*24,1)*60,1)*60),'FM00') "Shift Timings" FROM (SELECT JOBID, JOBSTART, JOBEND, GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) JOBDAYSTART, LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD')) JOBDAYEND, NDAY FROM (SELECT LEVEL NDAY FROM DUAL CONNECT BY LEVEL <= (SELECT CEIL(MAX(JOBEND - JOBSTART))+1 FROM JOBS)), JOBS WHERE GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) <= LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD'))) JOIN (SELECT SHIFTSTART, SHIFTEND, DAY, 0 SHIFTENDOFFSET FROM SHIFTS WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') <= TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') UNION SELECT SHIFTSTART, SHIFTEND, DAY, 1 SHIFTENDOFFSET FROM SHIFTS WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') > TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS')) ON (TO_CHAR(JOBDAYSTART, 'Day','nls_date_language=english') LIKE (DAY||'%')) WHERE LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) > GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART) GROUP BY JOBID, JOBSTART, JOBEND

在你的榜样,你说工作1积聚42小时,但这是不正确的。作业1已超过52小时。工作3有42个小时。

您可以使用下面的脚本(它创造就业机会和班次表,介绍您的样品行,并执行3),4)和5)查询):

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS DAY'; 

DROP TABLE JOBS; 

DROP TABLE SHIFTS; 

CREATE TABLE JOBS 
(JOBID NUMBER, JOBSTART DATE, JOBEND DATE); 

CREATE TABLE SHIFTS 
(SHIFTSTART VARCHAR2(8), SHIFTEND VARCHAR2(8), DAY VARCHAR2(13)); 

INSERT INTO JOBS VALUES (1, TO_DATE('01.12.2013 16:38:56','DD.MM.YYYY HH24:MI:SS'), TO_DATE('09.12.2013 10:38:56','DD.MM.YYYY HH24:MI:SS')); 

INSERT INTO JOBS VALUES (2, TO_DATE('11.11.2013 10:14:13','DD.MM.YYYY HH24:MI:SS'), TO_DATE('07.12.2013 12:28:26','DD.MM.YYYY HH24:MI:SS')); 

INSERT INTO JOBS VALUES (3, TO_DATE('29.11.2013 08:20:22','DD.MM.YYYY HH24:MI:SS'), TO_DATE('05.12.2013 07:18:17','DD.MM.YYYY HH24:MI:SS')); 


-- Fix the start hour to 0:00:00 instead of 0:00 

INSERT INTO SHIFTS VALUES ('0:0:00','6:00:00','Monday'); 

INSERT INTO SHIFTS VALUES ('6:00:00','12:00:00','Monday'); 

INSERT INTO SHIFTS VALUES ('12:00:00','0:00:00','Tuesday'); 

INSERT INTO SHIFTS VALUES ('0:00:00','6:00:00','Wednesday'); 

INSERT INTO SHIFTS VALUES ('6:00:00','12:00:00','Saturday'); 

INSERT INTO SHIFTS VALUES ('6:00:00','12:00:00','Sunday'); 

COMMIT; 

SELECT JOBID, GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), 
JOBDAYSTART), LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND), 24*(
LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), 
JOBDAYSTART)) TOTAL 
FROM 
(SELECT JOBID, GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) JOBDAYSTART, LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD')) JOBDAYEND, NDAY 
FROM (SELECT LEVEL NDAY FROM DUAL CONNECT BY LEVEL <= (SELECT CEIL(MAX(JOBEND - JOBSTART))+1 FROM JOBS)), JOBS 
WHERE GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) <= LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD'))) 
JOIN 
(SELECT SHIFTSTART, SHIFTEND, DAY, 0 SHIFTENDOFFSET 
FROM SHIFTS 
WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') <= TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') 
UNION 
SELECT SHIFTSTART, SHIFTEND, DAY, 1 SHIFTENDOFFSET 
FROM SHIFTS 
WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') > TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') 
) 
ON (TO_CHAR(JOBDAYSTART, 'Day','nls_date_language=english') LIKE (DAY||'%')) 
WHERE LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) > GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), 
JOBDAYSTART) 
ORDER BY 1,2; 

SELECT JOBID, 24*SUM(
LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), 
JOBDAYSTART)) TOTAL 
FROM 
(SELECT JOBID, GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) JOBDAYSTART, LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD')) JOBDAYEND, NDAY 
FROM (SELECT LEVEL NDAY FROM DUAL CONNECT BY LEVEL <= (SELECT CEIL(MAX(JOBEND - JOBSTART))+1 FROM JOBS)), JOBS 
WHERE GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) <= LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD'))) 
JOIN 
(SELECT SHIFTSTART, SHIFTEND, DAY, 0 SHIFTENDOFFSET 
FROM SHIFTS 
WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') <= TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') 
UNION 
SELECT SHIFTSTART, SHIFTEND, DAY, 1 SHIFTENDOFFSET 
FROM SHIFTS 
WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') > TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') 
) 
ON (TO_CHAR(JOBDAYSTART, 'Day','nls_date_language=english') LIKE (DAY||'%')) 
WHERE LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) > GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), 
JOBDAYSTART) 
GROUP BY JOBID; 

SELECT JOBID "Job_ID", JOBSTART "Start_Time", JOBEND "End_Time", TRUNC(SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)))||' '|| TO_CHAR(TRUNC(MOD(SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)),1)*24),'FM00')||':'|| TO_CHAR(TRUNC(MOD(MOD(SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)),1)*24,1)*60),'FM00')||':'|| TO_CHAR(TRUNC(MOD(MOD(MOD(SUM(LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) - GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART)),1)*24,1)*60,1)*60),'FM00') "Shift Timings" FROM (SELECT JOBID, JOBSTART, JOBEND, GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) JOBDAYSTART, LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD')) JOBDAYEND, NDAY FROM (SELECT LEVEL NDAY FROM DUAL CONNECT BY LEVEL <= (SELECT CEIL(MAX(JOBEND - JOBSTART))+1 FROM JOBS)), JOBS WHERE GREATEST(JOBSTART, TRUNC(JOBSTART+(NDAY-1),'DDD')) <= LEAST(JOBEND, TRUNC(JOBEND+NDAY,'DDD'))) JOIN (SELECT SHIFTSTART, SHIFTEND, DAY, 0 SHIFTENDOFFSET FROM SHIFTS WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') <= TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') UNION SELECT SHIFTSTART, SHIFTEND, DAY, 1 SHIFTENDOFFSET FROM SHIFTS WHERE TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS') > TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS')) ON (TO_CHAR(JOBDAYSTART, 'Day','nls_date_language=english') LIKE (DAY||'%')) WHERE LEAST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTEND,'YYYY-MM-DD HH24:MI:SS') + SHIFTENDOFFSET, JOBDAYEND) > GREATEST(TO_DATE(TO_CHAR(JOBDAYSTART,'YYYY-MM-DD ') || SHIFTSTART,'YYYY-MM-DD HH24:MI:SS'), JOBDAYSTART) GROUP BY JOBID, JOBSTART, JOBEND;