Chaque ligne est un événement qui a une date de debut et une date de fin.
J'ai besoin de savoir pour chaque évenements combien d'autres évènements se deroulent en même temps.
Je suis un peu perdu
d'avance
Chaque ligne est un événement qui a une date de debut et une date de fin.
J'ai besoin de savoir pour chaque évenements combien d'autres évènements se deroulent en même temps.
Je suis un peu perdu
d'avance
Sans jeu d'essais ou exemple, dur de répondre
dans le cas de périodes identiques, le problème est assez simple, par contre si il s'agit de détecter des recoupement, c'est plus ennuyeux ...
Ex de post traitant de sujet "similaire" :
- Trouver le nombre max d'éléments apparu dans un intervale de temps
(N'hésite pas à rechercher d'autres exemples sur le forum)
Je vais clarifier.
J'ai les données Id, debut et fin (des logs en fait) et je cherche à remplir la colonne nb.
La colonne nb sert à dire que durant l'intervalle entre debut et fin, il y a eu en tous N logs.
Je ne veux pas particulièrement être précis: il s'agit de dire: durant cette période N logs ont été effectué, le logs en lui-même plus les autres qui couvre en partie ou totalement (peu importe).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ID debut fin nb EMC 2006-10-02 11:39:04.000 2006-10-02 11:46:06.000 2 LGU 2006-10-02 11:39:35.000 2006-10-02 11:46:26.000 2 LVI 2006-10-02 11:48:40.000 2006-10-02 11:55:03.000 2 LGU 2006-10-02 11:49:17.000 2006-10-02 11:55:54.000 2 lau 2006-10-02 12:12:37.000 2006-10-02 12:19:35.000 2 LVI 2006-10-02 12:10:36.000 2006-10-02 12:23:07.000 2
Et là, je sais que c'est possible mais je suis incapable de formuler ça sous forme d'une requête SQL.
Donc d'avance
OK, donc si on se base sur l'hypoythèse que tu souhaites récupérer tous les événements intervenus par rapport à une période donnée (periodeDeb, periodeFin), plusieurs cas peuvent se produire :Le cas ou l'événement est inclus à la période est déjà géré par les 2 premiers cas.
- periodeDeb < DateDebutEvt < periodeFin (l'événement a démarré durant la période)
- periodeDeb < DateFinEvt < periodeFin (l'événement s'est terminé durant la période)
- DateDebutEvt < periodeDeb ET DateFinEvt > periodeFin (l'événement englobe la période recherchée)
Donc en SQL, si debut et fin sont tes noms de champsça devrait donner qqchose comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT COUNT(*) FROM Log WHERE periodeDeb < debut < periodeFin OR periodeDeb < fin < periodeFin OR (debut < periodeDeb AND fin > periodeFin);
Saluton,Je passerais par une auto-jointure un peu spéciale
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT l1.ID, COUNT(l1.ID) as effectif FROM logs AS l1 INNER JOIN logs AS l2 ON l2.debut BETWEEN l1.debut AND l2.fin OR l2.fin BETWEEN l1.debut AND l2.fin GROUP BY l1.ID
Il faut implémenter le prédicats OVERLAPS, tel que je l'ai décrit ici : http://sqlpro.developpez.com/cours/gestiontemps/#L1.2.2
A +
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager