WITH shift_user AS(
SELECT
room_id,
user_id,
in_time,
HOUR(date_add(in_time ,interval 12 hour)) MOD 24 AS shift_in_time,
out_time,
HOUR(date_add(out_time , interval 12 hour)) MOD 24 AS shift_out_time
FROM user_view_tb
),-- [23,24] -> [11,12] -> [1,2], 相当流氓的做了一个shift
shift_select AS(
SELECT
room_id,
user_id
FROM shift_user
WHERE
(shift_in_time<=11 AND shift_out_time between 11 AND 12) OR --[shift_in_time,shift_out_time]与[11,12]窗口有重叠的条件
(shift_out_time>=12 AND shift_in_time between 11 AND 12) OR
((shift_in_time between 11 AND 12) AND (shift_out_time between 11 AND 12))
)
SELECT
shift_select.room_id,
room_info.room_name,
count(distinct shift_select.user_id) AS user_count
FROM shift_select
LEFT JOIN room_info_tb AS room_info
ON shift_select.room_id=room_info.room_id
GROUP BY
shift_select.room_id,
room_info.room_name;