如何筛选与指定日期范围完全匹配的行?SQL查询问题求助
问题解决:获取日期范围完全可用的酒店房间
原查询的问题在于:它只筛选出了目标日期范围内至少有一天可用的房间,但没有验证这些房间是否在整个日期范围的每一天都处于可用状态,因此会混入不符合要求的结果。
以下是两种可行的修正方案:
方案一:通过统计可用天数匹配日期范围
SELECT r.hotel_id, JSON_ARRAYAGG(rs.date) AS availableDate FROM rooms r INNER JOIN room_status rs ON r.id = rs.room_id WHERE rs.date BETWEEN '2023-03-08' AND '2023-03-13' AND rs.is_available = true GROUP BY r.id, r.hotel_id -- 确保可用天数等于日期范围总天数(含首尾共6天) HAVING COUNT(DISTINCT rs.date) = DATEDIFF('2023-03-13', '2023-03-08') + 1;
逻辑说明:通过COUNT(DISTINCT rs.date)统计房间在目标区间内的可用天数,用DATEDIFF +1计算出区间总天数,只有两者相等时,才能证明该房间在这段时间的每一天都可用。
方案二:排除存在不可用日期的房间
SELECT r.hotel_id, JSON_ARRAYAGG(rs.date) AS availableDate FROM rooms r INNER JOIN room_status rs ON r.id = rs.room_id WHERE rs.date BETWEEN '2023-03-08' AND '2023-03-13' AND rs.is_available = true -- 排除目标区间内有任何一天不可用的房间 AND r.id NOT IN ( SELECT room_id FROM room_status WHERE date BETWEEN '2023-03-08' AND '2023-03-13' AND is_available = false ) GROUP BY r.id, r.hotel_id;
逻辑说明:先通过子查询找出所有在目标日期范围内存在不可用记录的房间ID,主查询直接排除这些房间,剩下的就是整个区间都保持可用的房间。
内容的提问来源于stack exchange,提问作者Jay Lee
相关产品推荐
相关产品推荐

