Thật khó để đưa ra câu trả lời đầy đủ cho bạn ở đây, vì bạn chỉ cho chúng tôi xem bảng có các yêu cầu đặt phòng - chúng tôi không thể biết có những loại phòng nào.
SQL trả về room_id's cho các phòng được đặt trong ít nhất một phần của khoảng thời gian đã chọn có thể là:
SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;
Nếu bạn đã có một bảng phòng (chứ không phải đã đặt trước), bạn có thể trả lại danh sách bất kỳ phòng nào chưa được đặt trong khoảng thời gian đó với:
SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
SELECT DISTINCT( `room_id` )
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);
SỬA ĐỔI
Dựa trên phản hồi của OP, các giả định bây giờ là:
- Bảng chứa thông tin chi tiết về các phòng có sẵn trong khoảng thời gian bắt đầu từ ngày trong cột
dt
và kết thúc vào ngày hôm sau (tức là phòng khách sạn) - Truy vấn sẽ trả về bất kỳ phòng nào còn trống trong khoảng thời gian đã nhập (vì vậy, chỉ những phòng trống từ NGÀY A đến NGÀY B mới được trả lại.
Như vậy, mã được sửa đổi là:
SELECT room_id
FROM available_rooms
WHERE dt BETWEEN "[start date]" AND DATE_SUB("[end date]",INTERVAL 1 DAY)
GROUP BY room_id
HAVING COUNT(*)=ABS(DATEDIFF("[start date]","[end date]"));