sql >> Databasteknik >  >> RDS >> Mysql

Välj tillgängliga rum mellan två datum

Det här är svårt att komma med ett fullständigt svar för dig här, eftersom du bara visar oss tabellen som innehåller bokningarna - vi kan inte veta vilket utbud av rum som är tillgängliga.

SQL som returnerar room_id:s för rum som är bokade för åtminstone en del av den valda perioden kan vara:

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

Om du hade en tabell med rum (snarare än bokningar), skulle det vara möjligt för dig att returnera en lista över alla rum som inte bokats under den perioden med:

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

ÄNDRING

Baserat på feedback från OP är antagandena nu:

  • Tabellen innehåller information om rum som är tillgängliga för en period som börjar på datumet i kolumn dt och slutar följande dag (dvs. hotellrum)
  • Frågan bör returnera alla rum som är tillgängliga för hela den angivna perioden (så endast rum som är tillgängliga från DAG A till DAG B kommer att returneras.

Som sådan är den ändrade koden:

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. Avfyrar SQL-fråga när du klickar på knappen?

  2. Hur CHAR_LENGTH() fungerar i MariaDB

  3. OPENROWSET accepterar inte variabler för sina argument (SQL Server)

  4. Hur man sorterar rader av HTML-tabeller som anropas från MySQL