전체 작업 등록 TABLE에 전체 작업 시간만 등록 됨
01:00 ~ 03:30 2시간 30분
작업중간 쉬는시간은 TABLE 등록됨 ( 시간 정해져 있지 않고 일자마다 다름 )
01:50 ~ 02:00 10분
02:50 ~ 03:05 15분
지나간 작업 및 휴무 이력을 위 두개 TABLE을 사용해서 쿼리로
01:00 ~ 01:50 작업
01:50 ~ 02:00 휴식
02:00 ~ 02:50 작업
02:50 ~ 03:05 휴식
03:05 ~ 03:30 작업
이럭식으로 만들고 싶습니다. 방법이 없을까요 ?
DB는 오라클은 9i 입니다. 감사합니다.
-- 5분 단위로 가정하고 해봤는데 지저분하고 구멍이 많아보이네요..;; -- 고려안된 부분이 많습니다(날짜변경, 10분 이하 휴식 등) -- 이런식으로도 가능은 하다 정도만 참고하시면 좋을 것 같습니다. WITH t1(f, t) AS ( SELECT '01:00', '03:30' FROM dual ) , t2(f, t) AS ( SELECT '01:50', '02:00' FROM dual UNION ALL SELECT '02:50', '03:05' FROM dual ) SELECT TO_CHAR(MIN(a), 'hh24:mi') || ' ~ ' || TO_CHAR(MAX(a), 'hh24:mi') || ' 작업' ft FROM ( SELECT a, SUM(gb) OVER(ORDER BY a) gb FROM ( SELECT a, DECODE(a, (LAG(a, 1) OVER(ORDER BY 1)) + TO_DSINTERVAL('000 00:05:00'), 0, 1) gb FROM ( SELECT TO_TIMESTAMP(t1.f, 'hh24:mi') + TO_DSINTERVAL('000 00:05:00') * (lv - 1) a FROM t1, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 300) tmp WHERE tmp.lv <= (extract(hour FROM TO_TIMESTAMP(t1.t, 'hh24:mi') - TO_TIMESTAMP(t1.f, 'hh24:mi')) * 12 + extract(minute FROM TO_TIMESTAMP(t1.t, 'hh24:mi') - TO_TIMESTAMP(t1.f, 'hh24:mi')) / 5) + 1 MINUS SELECT b FROM ( SELECT TO_TIMESTAMP(t2.f, 'hh24:mi') + TO_DSINTERVAL('000 00:05:00') * (lv - 1) b, lv, ROW_NUMBER() OVER(PARTITION BY t2.f ORDER BY lv desc) lv2 FROM t2, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 300) tmp WHERE tmp.lv <= (extract(hour FROM TO_TIMESTAMP(t2.t, 'hh24:mi') - TO_TIMESTAMP(t2.f, 'hh24:mi')) * 12 + extract(minute FROM TO_TIMESTAMP(t2.t, 'hh24:mi') - TO_TIMESTAMP(t2.f, 'hh24:mi')) / 5) + 1 ) WHERE lv <> 1 AND lv2 <> 1 ) ) ) GROUP BY gb UNION ALL SELECT f || ' ~ ' || t || ' 휴식' FROM t2 ORDER BY 1
WITH work_t AS ( SELECT '20200210' dt, '0100' stm, '0330' etm FROM dual ) , rest_t AS ( SELECT '20200210' dt, '0150' stm, '0200' etm FROM dual UNION ALL SELECT '20200210', '0250', '0305' FROM dual ) SELECT * FROM (SELECT dt , stm , LEAD(stm) OVER(ORDER BY stm) etm , gb FROM (SELECT dt, stm, '작업' gb FROM work_t UNION ALL SELECT dt, etm, '종료' gb FROM work_t UNION ALL SELECT dt, stm, '휴식' gb FROM rest_t UNION ALL SELECT dt, etm, '작업' gb FROM rest_t ) WHERE dt = '20200210' ) WHERE gb != '종료' ;