2013-12-10 2 views
0

두 개의 테이블이 있습니다. 특정 작업의 시작 날짜와 종료 날짜 및 시프트 타이밍이있는 다른 테이블. 이 시프트 테이블의 구조오라클의 시프트 타이밍 계산

작업 테이블

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 시간의 시프트 타이밍이있었습니다 (간격으로 계산 됨) 값). 나는 나의 요구 사항을 분명히 바란다.

시작 시간과 종료 시간이있는 작업 입력의 각 행에 대해 이동 시간이 얼마나 소요되었는지 계산해야합니다. 이 문제에 대한

+0

당신의 시도를 작성하십시오

당신은, 4), 5) 쿼리(), 귀하의 샘플 행을 소개 그것은 테이블을 일자리를 창출하고 변화와 3을 수행) 다음과 같은 스크립트를 사용할 수 있습니다. – Oyeme

+0

테이블과 예상 출력에 대한 샘플 데이터를 게시하십시오. – Noel

+0

"작업이 '01.12.2013 16:38:56'에 시작된 시간부터 '09.12.2013 10:38:56'에 마감 될 때까지 총 42 시간의 근무 시간이있었습니다." ? 이 두 날짜 사이에는 42 시간 이상의 간격이 있습니다. –

답변

0

하나 개의 솔루션은 다음과 같습니다

1) 작업은 시간 간격이고, 당신은 매일 1 개 튜플을 생성해야합니다. 일자리가 오늘 시작되어 내일 끝나면 ​​두 개의 튜플 (오늘과 내일 날짜)이 필요합니다. 당신은이 작업을 수행 할 수 있습니다 : 당신은 종료 시간 일부 행에 (SHIFT 테이블을 수정해야)

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 0시 0분 0초이며,이) 다음 날의 시간입니다. 당신은 사용할 수 있습니다

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으로 나누어 총 시간을 구합니다. 당신이 한 42 시간 축적하는 일을 말하지만,이 정확하지 않은 당신의 예에서

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

:

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) 마지막으로, 당신의 예상 출력 형식을 적용합니다. 직업 1에는 52 시간 이상이 있습니다. 직업 3에는 42 시간이 있습니다.

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;