3 votes

Besoin de vérifier si une plage de dates chevauche une autre plage de dates en sql

Je possède une table qui stocke les réservations de chambres, le schéma est le suivant:

ID | ROOM_ID | CHECK_IN_DATE | CHECK_OUT_DATE | USER_ID

J'ai besoin d'exécuter une requête de recherche pour les chambres disponibles/indisponibles entre une plage de dates définie.

Gardez également à l'esprit qu'il existe une autre table qui contient les dates auxquelles la chambre est pré-réservée et son format est le suivant:

ROOM_ID | DATE

Donc j'ai besoin d'exécuter une requête qui recherche les chambres disponibles dans une plage définie. Comment formuler la requête? Je suis en train d'utiliser MySQL ici.

---modification---

Il y a aussi une table Chambres avec le schéma suivant:

ID | DÉTAILS DE LA CHAMBRE etc

La table des dates de non disponibilité/pré-réservation contient essentiellement des dates ponctuelles isolées, chaque date dans la table de non disponibilité fait référence à une date où la chambre ne peut pas être réservée pour une raison quelconque, par exemple pour des travaux de maintenance.

2voto

Explosion Pills Points 89756
SÉLECTIONNER
   ROOM_ID
DEPUIS
   Chambres r
   LEFT JOIN Réservations b SUR (
      r.ROOM_ID = b.ROOM_ID
      ET b.CHECK_IN_DATE > '$MAX_DATE'
      ET b.CHECK_OUT_DATE < '$MIN_DATE'
   )

Je ne suis pas sûr de comment les chambres pré-réservées sont prises en compte car il n'y a pas de plage de dates. Les chambres pré-réservées obtiennent-elles également une entrée dans les réservations ou non?

1voto

Alessandro Points 1149
SÉLECTIONNER id DE rooms OÙ id NON DANS (
   SÉLECTIONNER room_id DE bookings 
   OÙ check_in_date < 'end date' ET check_out_date > 'start date'
);

0voto

kairius Points 101

Il y a comme 5 façons possibles:

---s-----e---

s-e----------
--s-e--------
-----s-e-e---
--------s-e--
----------s-e

s = début / e=fin la première ligne est votre ensemble de données et les autres sont des recherches possibles

seule la première et la dernière sont celles que vous voulez donc ce que vous cherchez est: recherche.fin < début.entrée OU recherche.début > fin.entrée

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X