2013-12-10 32 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;