작업 및 시간 쿼리 부탁드림 ( 오라클9i) 0 7 632

by 달려라 [SQL Query] [2020.02.10 11:59:25]


전체 작업 등록 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 입니다. 감사합니다.

by 마농 [2020.02.10 13:00:48]

일자 및 시간 정보의 저장 형태가 어떻게 되나요?
일자 및 시간이 한개 컬럼에 함께 저장되는지?
일자 및 시간이 두개 컬럼에 나뉘어 저장하는지?
DATE 타입인지? VARCHAR2 타입인지?
varchar2 타입의 경우 저장 포멧이 어떻게 되는지?


by 달려라 [2020.02.10 13:04:52]

모두 vachar2 컬럼이고

일자varchar2(8)와 시간 varchar(4)은 다른 컬럼으로 저장되어 있습니다

감사합니다. ^^;;


by 랑에1 [2020.02.10 15:01:34]
-- 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

 


by 마농 [2020.02.10 15:01:53]

작업 시간 관리가 작업자 별로 이루어 지는지? 일괄 적용되는지?
휴식 시간 관리가 작업자 별로 이루어 지는지? 일괄 적용되는지?


by 마농 [2020.02.10 15:30:38]
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 != '종료'
;

 


by 달려라 [2020.02.10 15:45:39]

감사합니다.   도움이 많이 되었습니다.

주신 쿼리 응용 하면 될것 같습니다. ^^;;;

 


by 랑에1 [2020.02.10 15:52:52]

간단한 방법이 있었군요 허허..

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입