MSSQL 질문드립니다. (고수분들 도와주세요)
-
게시물 수정 , 삭제는 로그인 필요
WORK_TIME 이라는 근무시간 테이블이 있습니다.
이 테이블에는 START_TIME 컬럼과 END_TIME 컬럼이 있고, ROW는 5개의 행이 있습니다.
START_TIME END_TIME
08:30 10:30
10:45 12:30
13:30 15:45
16:00 18:15
18:45 20:30
저는 여기서 WORK_TIME 테이블을 이용해서 각 시간대별 초 단위 근무시간 합계는 아래가 되겠죠.
08시 : 08:30:00 ~ 08:59:59 -> 1799
09시 : 09:00:00 ~ 09:59:59 -> 3599
10시 : 10:00:00 ~ 10:30:00 + 10:45:00 ~ 10:59:59 -> 2699
11시 : 11:00:00 ~ 11:59:59 -> 3599
12시: 12:00:00 ~ 12:30:00 -> 1800
13시 : 13:30:00 ~ 13:59:59 -> 3599
14시 : 14:00:00 ~ 14:59:59 -> 3599
15시 : 15:00:00 ~ 15:45:00 -> 2700
16시 : 16:00:00 ~ 16:59:59 -> 3599
17시 : 17:00:00 ~ 17:59:59 -> 3599
18시 : 18:00:00 ~ 18:15:00 + 18:45:00 ~ 18:59:59 -> 1799
19시 : 19:00:00 ~ 19:59:59 -> 3599
20시 : 20:00:00 ~ 20:30:00 -> 1800
(식은 이해를 돕게.)
여기서 저는, 현재시간이 08시 40분이면
08시 : 08:30:00 ~ 08:40 -> 600
또는 현재시간이 10시 55분 이라고 하면 이전 근무시간과 같이 아래처럼
08시 : 08:30:00 ~ 08:59:59 -> 1799
09시 : 09:00:00 ~ 09:59:59 -> 3599
10시 : 10:00:00 ~ 10:30:00 + 10:45:00 ~ 10:55:00 -> 2400
또는 현재시간이 18:20분일 경우
08시 : 08:30:00 ~ 08:59:59 -> 1799
09시 : 09:00:00 ~ 09:59:59 -> 3599
10시 : 10:00:00 ~ 10:30:00 + 10:45:00 ~ 10:59:59 -> 2699
11시 : 11:00:00 ~ 11:59:59 -> 3599
12시: 12:00:00 ~ 12:30:00 -> 1800
13시 : 13:30:00 ~ 13:59:59 -> 1799
14시 : 14:00:00 ~ 14:59:59 -> 3599
15시 : 15:00:00 ~ 15:45:00 -> 2700
16시 : 16:00:00 ~ 16:59:59 -> 3599
17시 : 17:00:00 ~ 17:59:59 -> 3599
18시 : 18:00:00 ~ 18:15:00 -> 900
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
아래는 제가 만들었던 쿼리입니다.
도저히 못해먹겠어서 도움 요청드리니 참고하셔서 만들어주시면 감사드리겠습니다.
결과값으로는 아래와 같이 나오게 되고, 여기서 임의의 시간을 변수로 받아서 위에처럼 계산되었으면 합니다.
08시 1799
09시 3599
10시 2699
11시 3599
12시 1800
13시 1799
14시 3599
15시 2700
16시 3599
17시 3599
18시 1799
19시 3599
20시 1800
WITH time_slots (slot_start, slot_end) AS (
SELECT '08:00:00', '08:59:59'
UNION ALL
SELECT '09:00:00', '09:59:59'
UNION ALL
SELECT '10:00:00', '10:59:59'
UNION ALL
SELECT '11:00:00', '11:59:59'
UNION ALL
SELECT '12:00:00', '12:59:59'
UNION ALL
SELECT '13:00:00', '13:59:59'
UNION ALL
SELECT '14:00:00', '14:59:59'
UNION ALL
SELECT '15:00:00', '15:59:59'
UNION ALL
SELECT '16:00:00', '16:59:59'
UNION ALL
SELECT '17:00:00', '17:59:59'
UNION ALL
SELECT '18:00:00', '18:59:59'
UNION ALL
SELECT '19:00:00', '19:59:59'
UNION ALL
SELECT '20:00:00', '20:59:59'
),
work_hours AS (
SELECT
CAST(START_TIME AS DATETIME) AS start_time,
CAST(END_TIME AS DATETIME) AS end_time,
DATEDIFF(SECOND, START_TIME, END_TIME) AS diff
FROM WORK_TIME
)
SELECT
CONCAT(LEFT(time_slots.slot_start, 2), '시') AS time_slot,
COALESCE(
CONVERT(VARCHAR, SUM(
CASE
WHEN work_hours.start_time < time_slots.slot_start AND work_hours.end_time > time_slots.slot_end THEN DATEDIFF(SECOND, time_slots.slot_start, time_slots.slot_end)
WHEN work_hours.start_time >= time_slots.slot_start AND work_hours.end_time <= time_slots.slot_end THEN DATEDIFF(SECOND, work_hours.start_time, work_hours.end_time)
WHEN work_hours.start_time < time_slots.slot_start AND work_hours.end_time > time_slots.slot_start THEN DATEDIFF(SECOND, time_slots.slot_start, work_hours.end_time)
WHEN work_hours.start_time < time_slots.slot_end AND work_hours.end_time > time_slots.slot_end THEN DATEDIFF(SECOND, work_hours.start_time, time_slots.slot_end)
END
)), '00:00:00'
) AS total_work_time
FROM time_slots
LEFT JOIN work_hours
ON 1=1
GROUP BY time_slots.slot_start, time_slots.slot_end
ORDER BY time_slots.slot_start;
이 테이블에는 START_TIME 컬럼과 END_TIME 컬럼이 있고, ROW는 5개의 행이 있습니다.
START_TIME END_TIME
08:30 10:30
10:45 12:30
13:30 15:45
16:00 18:15
18:45 20:30
저는 여기서 WORK_TIME 테이블을 이용해서 각 시간대별 초 단위 근무시간 합계는 아래가 되겠죠.
08시 : 08:30:00 ~ 08:59:59 -> 1799
09시 : 09:00:00 ~ 09:59:59 -> 3599
10시 : 10:00:00 ~ 10:30:00 + 10:45:00 ~ 10:59:59 -> 2699
11시 : 11:00:00 ~ 11:59:59 -> 3599
12시: 12:00:00 ~ 12:30:00 -> 1800
13시 : 13:30:00 ~ 13:59:59 -> 3599
14시 : 14:00:00 ~ 14:59:59 -> 3599
15시 : 15:00:00 ~ 15:45:00 -> 2700
16시 : 16:00:00 ~ 16:59:59 -> 3599
17시 : 17:00:00 ~ 17:59:59 -> 3599
18시 : 18:00:00 ~ 18:15:00 + 18:45:00 ~ 18:59:59 -> 1799
19시 : 19:00:00 ~ 19:59:59 -> 3599
20시 : 20:00:00 ~ 20:30:00 -> 1800
(식은 이해를 돕게.)
여기서 저는, 현재시간이 08시 40분이면
08시 : 08:30:00 ~ 08:40 -> 600
또는 현재시간이 10시 55분 이라고 하면 이전 근무시간과 같이 아래처럼
08시 : 08:30:00 ~ 08:59:59 -> 1799
09시 : 09:00:00 ~ 09:59:59 -> 3599
10시 : 10:00:00 ~ 10:30:00 + 10:45:00 ~ 10:55:00 -> 2400
또는 현재시간이 18:20분일 경우
08시 : 08:30:00 ~ 08:59:59 -> 1799
09시 : 09:00:00 ~ 09:59:59 -> 3599
10시 : 10:00:00 ~ 10:30:00 + 10:45:00 ~ 10:59:59 -> 2699
11시 : 11:00:00 ~ 11:59:59 -> 3599
12시: 12:00:00 ~ 12:30:00 -> 1800
13시 : 13:30:00 ~ 13:59:59 -> 1799
14시 : 14:00:00 ~ 14:59:59 -> 3599
15시 : 15:00:00 ~ 15:45:00 -> 2700
16시 : 16:00:00 ~ 16:59:59 -> 3599
17시 : 17:00:00 ~ 17:59:59 -> 3599
18시 : 18:00:00 ~ 18:15:00 -> 900