안녕하세요 쿼리 도움좀 요청합니다.
A라는 근로자가 3/1일 저녁6시(18시) 부터 다음날(3/2) 새벽 4시까지 일을 했을경우
심야시간 근로한 시간을 구하고자 합니다.
심야시간은 22시부터 다음날 06시까지가 심야시간으로 정해져있습니다.
예) 구분 시작시간 종료시간 원하는 데이타값
A 2021-03-01 18:00:00 2021-03-02 04:00:00 6시간
고수님들의 도움 부탁드립니다.
감사합니다.
종료시간에서 지정된 시간을 빼면 되지 않을까요? 방법은 여러가지 있을것 같은데.. 제가 해본것 올립니다.
select timestampdiff(hour,'2021-03-01 22:00:00', edt) diff
from (select '2021-03-01 18:00:00' sdt, '2021-03-02 04:00:00' edt) t
where sdt < '2021-03-01 22:00:00'
select timestampdiff(hour, concat(date_sub(date(edt) , interval 1 day), ' 22:00:00'), edt) diff
where sdt < concat(date_sub(date(edt) , interval 1 day), ' 22:00:00')
WITH t AS ( SELECT 1 idx, 'A' nm, '2021-03-01 18:00:00' sdt, '2021-03-02 04:30:00' edt UNION ALL SELECT 2, 'A', '2021-03-04 05:30:00', '2021-03-04 23:30:00' UNION ALL SELECT 3, 'B', '2021-03-04 09:00:00', '2021-03-04 18:00:00' UNION ALL SELECT 4, 'C', '2021-03-01 18:00:00', '2021-03-02 08:00:00' UNION ALL SELECT 5, 'D', '2021-03-01 23:00:00', '2021-03-02 08:00:00' UNION ALL SELECT 6, 'E', '2021-02-28 23:00:00', '2021-03-02 08:00:00' ) SELECT idx, nm, sdt, edt , ROUND( SUM(CASE WHEN x < y THEN TIME_TO_SEC(TIMEDIFF(y, x)) ELSE 0 END) /60/60, 2) hours FROM (SELECT idx, nm, sdt, edt , GREATEST(s, DATE(s) + INTERVAL seq-1 DAY + INTERVAL 0 hour) x , LEAST (e, DATE(s) + INTERVAL seq-1 DAY + INTERVAL 8 hour) y FROM (SELECT idx, nm, sdt, edt , sdt + INTERVAL 2 HOUR s , edt + INTERVAL 2 HOUR e FROM t ) a LEFT OUTER JOIN (SELECT 1 seq UNION ALL SELECT 2 UNION ALL SELECT 3 ) b ON seq <= DATEDIFF(DATE(e), DATE(s)) + 1 ) a GROUP BY idx, nm, sdt, edt ;