sql >> Database teknologi >  >> RDS >> Mysql

Vælg ledige værelser mellem to datoer

Det er svært at komme med et fuldstændigt svar til dig her, da du kun viser os tabellen, som indeholder bookingerne - vi kan ikke vide, hvilket udvalg af værelser der er til rådighed.

SQL, som returnerer room_id'erne for værelser, der er booket i mindst en del af den valgte periode, kunne være:

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

Hvis du havde en tabel med værelser (i stedet for bookinger), ville det være muligt for dig at returnere en liste over værelser, der ikke var booket i den pågældende periode med:

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

ÆNDRING

Baseret på feedback fra OP er antagelserne nu:

  • Tabellen indeholder detaljer om lokaler, der er tilgængelige i en periode, der starter på datoen i kolonne dt og slutter den følgende dag (dvs. hotelværelser)
  • Forespørgslen skal returnere alle lokaler, der er tilgængelige for hele den indtastede periode (så kun lokaler, der er tilgængelige fra DAG A til DAG B, vil blive returneret.

Som sådan er den ændrede kode:

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. MySQL – Sådan genereres tilfældigt tal

  2. Hvilke brancher har størst gavn af adgang?

  3. Sådan fungerer SQLite Rtrim()

  4. Enkel måde at læse en enkelt post fra MySQL