sql >> Base de Datos >  >> RDS >> Mysql

Seleccionar habitaciones disponibles entre dos fechas

Es difícil encontrar una respuesta completa para usted aquí, ya que solo nos muestra la tabla que contiene las reservas; no podemos saber qué rango de habitaciones están disponibles.

El SQL que devuelve los room_id para las habitaciones que están reservadas durante al menos una parte del período seleccionado podría ser:

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

Si tuviera una tabla de habitaciones (en lugar de reservas), le sería posible devolver una lista de las habitaciones no reservadas durante ese período con:

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

ENMIENDA

Según los comentarios de OP, las suposiciones ahora son:

  • La tabla contiene detalles de las habitaciones que están disponibles durante un período que comienza en la fecha de la columna dt y finaliza el día siguiente (es decir, habitaciones de hotel)
  • La consulta debe devolver las habitaciones que estén disponibles durante la totalidad del período ingresado (por lo que solo se devolverán las habitaciones que estén disponibles del DÍA A al DÍA B).

Como tal, el código modificado es:

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