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;