Mysql
 sql >> база данни >  >> RDS >> Mysql

Изберете свободни стаи между две дати

Тук е трудно да се намери пълен отговор за вас, тъй като вие ни показвате само таблицата, която съдържа резервациите - не можем да знаем какъв набор от стаи са налични.

SQL, който връща room_id за стаи, които са резервирани поне за част от избрания период, може да бъде:

SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;

Ако сте имали таблица със стаи (вместо резервации), би било възможно да върнете списък на всички стаи, които не са резервирани през този период с:

SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
  SELECT DISTINCT( `room_id` )
  FROM `bookings`
  WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);

ИЗМЕНЕНИЕ

Въз основа на обратната връзка от OP, предположенията сега са:

  • Таблицата съдържа подробности за стаите, които са налични за период, започващ от датата в колона dt и приключва на следващия ден (т.е. хотелски стаи)
  • Заявката трябва да върне всички стаи, които са налични за целия въведен период (така че ще бъдат върнати само стаи, които са налични от ДЕН А до ДЕН Б.

Като такъв, измененият код е:

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. MySQL Използване на колона с низ с текст за дата като поле за дата

  2. Използването на заявка води до друга заявка

  3. Как да направя заявка за полета, съдържащи даден текст в MySQL?

  4. Rails Migration Създаване на първичен ключ на таблица

  5. предотвратяване на дублиращи се записи в базата данни