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