Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wählen Sie verfügbare Zimmer zwischen zwei Daten aus

Es ist schwierig, Ihnen hier eine vollständige Antwort zu geben, da Sie uns nur die Tabelle zeigen, die die Buchungen enthält - wir können nicht wissen, welches Zimmerangebot verfügbar ist.

SQL, das die room_ids für Zimmer zurückgibt, die für mindestens einen Teil des ausgewählten Zeitraums gebucht sind, könnte sein:

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

Wenn Sie eine Zimmertabelle (anstelle von Buchungen) hätten, könnten Sie eine Liste aller Zimmer zurücksenden, die in diesem Zeitraum nicht gebucht wurden, mit:

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

ÄNDERUNG

Basierend auf dem Feedback von OP lauten die Annahmen jetzt:

  • Die Tabelle enthält Angaben zu Zimmern, die für einen Zeitraum ab dem Datum in Spalte dt verfügbar sind und endet am nächsten Tag (zB Hotelzimmer)
  • Die Abfrage sollte alle Zimmer zurückgeben, die für den gesamten eingegebenen Zeitraum verfügbar sind (also werden nur Zimmer zurückgegeben, die von TAG A bis TAG B verfügbar sind.

Daher lautet der geänderte Code:

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