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

Seleziona le camere disponibili tra due date

È difficile trovare una risposta completa per te qui, poiché ci stai solo mostrando la tabella che contiene le prenotazioni:non possiamo sapere quale gamma di camere sono disponibili.

L'SQL che restituisce i room_id per le camere prenotate per almeno una parte del periodo selezionato potrebbe essere:

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

Se avessi un tavolo di camere (piuttosto che prenotazioni), sarebbe possibile restituire un elenco di tutte le camere non prenotate in quel periodo con:

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

EMENDAMENTO

Sulla base del feedback di OP, le ipotesi sono ora:

  • La tabella contiene i dettagli delle camere disponibili per un periodo che inizia dalla data nella colonna dt e termina il giorno successivo (es. camere d'albergo)
  • La query dovrebbe restituire tutte le camere disponibili per l'intero periodo inserito (quindi verranno restituite solo le camere disponibili dal GIORNO A al GIORNO B.

In quanto tale, il codice modificato è:

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