Vérifier le chevauchement de plages de date dans MySQL
Cette table est utilisée pour stocker les sessions (événements):
CREATE TABLE session (
id int(11) NOT NULL AUTO_INCREMENT
, start_date date
, end_date date
);
INSERT INTO session
(start_date, end_date)
VALUES
("2010-01-01", "2010-01-10")
, ("2010-01-20", "2010-01-30")
, ("2010-02-01", "2010-02-15")
;
Nous ne voulons pas avoir de conflit entre les plages.
Disons que nous avons besoin d'insérer une nouvelle session à partir de 2010-01-05 à 2010-01-25.
Nous voudrions savoir le conflit session(s).
Voici ma requête:
SELECT *
FROM session
WHERE "2010-01-05" BETWEEN start_date AND end_date
OR "2010-01-25" BETWEEN start_date AND end_date
OR "2010-01-05" >= start_date AND "2010-01-25" <= end_date
;
Voici le résultat:
+----+------------+------------+
| id | start_date | end_date |
+----+------------+------------+
| 1 | 2010-01-01 | 2010-01-10 |
| 2 | 2010-01-20 | 2010-01-30 |
+----+------------+------------+
Est-il un meilleur moyen d'obtenir cela?
- Votre troisième condition est fausse. Il est censé être
"2010-01-05" <= start_date AND "2010-01-25" >= end_date
. Voir stackoverflow.com/a/28802972/632951 pour la visualisation. Votre troisième condition ne sera jamais à évaluer, car la première (et deuxième) condition déjà le couvre.
Vous devez vous connecter pour publier un commentaire.
J'ai eu comme une requête avec une application de calendrier je l'ai déjà écrit. Je crois que j'ai utilisé quelque chose comme ceci:
Mise à JOUR Cela devrait fonctionner ((ns, ne, es, ee) = (new_start, new_end, existing_start, existing_end)):
Ici est un violon
=
dans son code au lieu de prendre la peine de s'en plaindre.Ces 3 lignes de code sql clauses de couvrir les 4 cas de chevauchement nécessaire.
Lamy réponse est bonne, mais vous pouvez l'optimiser un peu plus.
Cela va attraper tous les quatre scénarios où les plages se superposent et d'exclure les deux où ils ne sont pas.
J'ai dû faire face le problème similaire. Mon problème était de cesser de réservation entre une gamme de bloqué les dates. Par exemple la réservation est bloquée pour une propriété entre le 2 mai au 7 mai. J'avais besoin de trouver toute sorte de chevauchement de date de détecter et d'arrêter la réservation. Ma solution est similaire à LordJavac.
Laissez-moi savoir si cela ne fonctionne pas.
Donné deux intervalles comme (s1, e1) et (s2, e2) avec s1<e1 et s2<e2
Vous pouvez calculer le chevauchement comme ceci:
Fonctionnera aussi si un intervalle est à l'intérieur de l'autre.
Récemment, j'ai été aux prises avec le même problème et est arrivé à la fin avec cette une seule étape facile (Cela peut ne pas être une bonne approche ou la consommation de mémoire)-
Cela m'a aidé à trouver des entrées avec chevauchement des plages de dates.
Espère que cela aide quelqu'un.