Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chọn phòng trống giữa hai ngày

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]"));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để lưu trữ các ký tự không phải tiếng Anh?

  2. Phương pháp hay nhất:Nhập tệp mySQL bằng PHP; truy vấn tách

  3. mysql chọn các bản ghi lớn hơn 3 tháng

  4. Di chuyển cột văn bản vĩ độ / kinh độ thành cột loại 'điểm'

  5. Gửi tệp với người đưa thư đến API Laravel