sql >> Databáze >  >> RDS >> Mysql

Vyberte dostupné pokoje mezi dvěma termíny

Zde je pro vás těžké najít úplnou odpověď, protože nám ukazujete pouze tabulku, která obsahuje rezervace - nemůžeme vědět, jaký rozsah pokojů je k dispozici.

SQL, který vrací room_id's pro pokoje, které jsou rezervovány alespoň na část vybraného období, může být:

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

Pokud jste měli tabulku pokojů (spíše než rezervace), bylo by možné vrátit seznam všech pokojů, které nebyly během daného období rezervovány, pomocí:

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

ZMĚNA

Na základě zpětné vazby od OP jsou nyní předpoklady:

  • Tabulka obsahuje podrobnosti o pokojích, které jsou k dispozici pro období začínající datem ve sloupci dt a končící následující den (tj. hotelové pokoje)
  • Dotaz by měl vrátit všechny pokoje, které jsou k dispozici po celé zadané období (takže budou vráceny pouze pokoje, které jsou volné od DNE A do DNE B).

Jako takový je upravený kód:

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. Jaké jsou optimální velikosti varcharů pro MySQL?

  2. Chyba Postgres na insertu - CHYBA:neplatná sekvence bajtů pro kódování UTF8:0x00

  3. Prozkoumání formátů data Postgres a jejich různých funkcí

  4. Nastavení tabulky zeměpisné šířky a délky v MySQL