sql >> Database >  >> RDS >> Mysql

Selecteer beschikbare kamers tussen twee data

Het is moeilijk om hier een volledig antwoord voor je te bedenken, omdat je ons alleen de tabel laat zien die de boekingen bevat - we kunnen niet weten welke kamers beschikbaar zijn.

SQL die de room_id's retourneert voor kamers die voor ten minste een deel van de geselecteerde periode zijn geboekt, kan zijn:

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

Als u een tabel met kamers had (in plaats van boekingen), zou u een lijst kunnen terugsturen van kamers die in die periode niet zijn geboekt met:

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

AMENDEMENT

Op basis van de feedback van OP zijn de aannames nu:

  • De tabel bevat details van kamers die beschikbaar zijn voor een periode die begint op de datum in kolom dt en eindigend de volgende dag (dwz hotelkamers)
  • De zoekopdracht moet alle kamers retourneren die beschikbaar zijn voor de gehele ingevoerde periode (dus alleen kamers die beschikbaar zijn van DAG A tot DAG B worden geretourneerd.

Als zodanig is de gewijzigde 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]"));


  1. De top 5 functies die uw SQL Server Database Performance Monitoring Platform moet bieden

  2. Postgresql recursieve self-join

  3. mysqli_num_rows werkt niet correct

  4. Hoe efficiënt MySQLDB SScursor gebruiken?