Bonjour,
J'ai une table missions qui a deux champs date_début_mission et date_fin_mission, je veux savoir comment extraire les missions qui se déroulent dans la même période en requête Mysql/php ?
Merci d'avance
Bonjour,
J'ai une table missions qui a deux champs date_début_mission et date_fin_mission, je veux savoir comment extraire les missions qui se déroulent dans la même période en requête Mysql/php ?
Merci d'avance
Bonjour,
Quelle est la règle de gestion : même date de début et même date de fin pour les deux missions ou bien il suffit qu'il y ait chevauchement entre les deux périodes ?
Bonjour,
La règle de gestion est qu'il ait uniquement chevauchement entre les deux périodes
Bonjour,
Je vois deux méthodes:
- Tu vérifies que la date de début et celle de fin de la deuxième sont entre les dates de début et de fin de la première,, avec 2 between
- Tu vérifies que la date de début de la deuxième est inférieure à la date de fin de la première, et que la date de fin de la deuxième est supérieure à la date de début de la première.
Le choix de la "deuxième" période est arbitraire, vu qu'on cherche un chevauchement.
Pour ma part j'utilise la deuxième méthode.
Tatayo.
Voici un exemple de requête qui analyse chaque cas : chevauchement, égalité ou période disjointe
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 with tab1 (mission, dtdeb, dtfin) as (select 'Mission 01', '2019-02-01', '2019-02-04' union all select 'Mission 02', '2019-02-01', '2019-02-02' union all select 'Mission 03', '2019-02-03', '2019-02-05' union all select 'Mission 04', '2019-02-01', '2019-02-04' union all select 'Mission 05', '2019-02-08', '2019-02-09' union all select 'Mission 06', '2019-02-12', '2019-02-15' union all select 'Mission 07', '2019-02-14', '2019-02-16') select T1.mission , T2.mission , case when T1.dtdeb = T2.dtdeb and T1.dtfin = T2.dtfin then 'égalité' when T1.dtdeb < T2.dtfin and T1.dtfin > T2.dtdeb then 'chevauch' else 'RàS' end as cas from tab1 T1 left join tab1 T2 on T2.mission > T1.mission order by T1.mission, T2.mission
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 mission mission cas Mission 01 Mission 02 chevauch Mission 01 Mission 03 chevauch Mission 01 Mission 04 égalité Mission 01 Mission 05 RàS Mission 01 Mission 06 RàS Mission 01 Mission 07 RàS Mission 02 Mission 03 RàS Mission 02 Mission 04 chevauch Mission 02 Mission 05 RàS Mission 02 Mission 06 RàS Mission 02 Mission 07 RàS Mission 03 Mission 04 chevauch Mission 03 Mission 05 RàS Mission 03 Mission 06 RàS Mission 03 Mission 07 RàS Mission 04 Mission 05 RàS Mission 04 Mission 06 RàS Mission 04 Mission 07 RàS Mission 05 Mission 06 RàS Mission 05 Mission 07 RàS Mission 06 Mission 07 chevauch Mission 07 RàS
Salut à tous.
Periode 1 : datdeb1 ; datfin1Envoyé par madinadiouf
Periode 2 : datdeb2 ; datfin2
Il suffit de tester ceci :
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part where datdeb1 < datfin2 and datfin1 > datdeb2;
Si vous êtes de mon aide, vous pouvez cliquer sur .
Mon site : http://www.jcz.fr
Bonjour à tous,
Ma règle de gestion est la suivante :
Pour chaque agent, et pour chaque mission qu'il participe ,je sélectionne sa date de début de mission et sa date de fin de mission, puis je le compare avec les missions en cours s'il y'a une autre mission dans laquelle il participe dans la même période.
Supposons que la date de début de la mission de l'agent est datedebut_mission_agt et datefin_mission_agt
et date_debut_mission la date de début d'une mission donnée et date_fin_mission sa date de fin.
Comment comparer les dates ?
Exactement comme on te l'a expliqué dans les réponses ci-dessus.
Sauf qu'Artémus24 et moi-même avons fait la même erreur:
Après tout, les deux périodes peuvent avoir la même date de début et/ou la même date de fin.
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 where datdeb1 <= datfin2 and datfin1 => datdeb2;
Tatayo.
Bonjour,
Merci j'ai compris. je faire les tests et vous revenir après
En fait, tout dépend de la façon dont sont définis les intervalles.
Souvent, la date de début est incluse et la date de fin exclue, mais ce n'est pas une règle absolue
À noter également qu'une période peut être définie par une date de début et une durée
Et aussi, pour être complet, que certains SGBD comme PostGreSQL proposent des données de type INTERVAL (mais pas MySQL) avec des fonctions associées (OVERLAPS)
Bonjour,
Moi je pense que ça va aller car je travaille sous Mysql.
Salut à tous.
Quelle erreur ?Envoyé par tatayo
Y-a-t-il chevauchement quand une mission commence et une autre se termine le même jour ?
L'inclusion des bornes est souvent le cas dans cette gestion des périodes.
Mais comme l'indique Escartefigue, la période s'exprime dans l'usage qui est appliquée.
Il y a réciprocité dans l'usage des deux périodes que l'on désire comparer.Envoyé par madinadiouf
Ou si vous préférez, vous pouvez remplacer periode 1 par période 2 et inversement, ce qui donne exactement le même test :
@ madinadiouf : le mieux est de travailler sur un exemple concret et de voir si le résultat que vous obtenez vous convient.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 where datdeb1 <= datfin2 and datfin1 => datdeb2; where datdeb2 <= datfin1 and datfin2 => datdeb1;
@+
Si vous êtes de mon aide, vous pouvez cliquer sur .
Mon site : http://www.jcz.fr
Entre temps j'avais fait un tour sur le logiciel d'encaissement que nous utilisons. Comme ce dernier gère tout ce qui ressemble à une période (validité d'une carte de fidélité, opération commerciale), si une période se termine le 2, et une autre commence le 2, pour nous il y a chevauchement sur le 2. D'où mon dernier message.
Si effectivement la date de fin n'est pas incluse (ce qui visiblement est "la règle"), la seule erreur est dans mon dernier message . OTAN pour moi.
Tatayo.
Bonjour,
Comme j'ai une table mission_agent qui contient les missions de chaque agent avec deux champs l'id de l’agent et l'id de la mission et d'autre part une table missions qui contient toutes les missions.
avec arrivee_mission >= CURDATE(), j'ai les missions en cours qui ne sont pas encore terminées.
Je demande si je fais cette requête
Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $sql =$bdd_mission_msas->prepare('SELECT miss_agt.mission_id FROM mission_agents miss_agt,missions miss where (miss_agt.mission_id=miss.mission_id and miss.arrivee_mission >= CURDATE() and miss_agt.agent_id=?)') ; $sql->execute(array($agent_id_tous)) ;
$agent_id_tous est l'id de l'agent concerné
puis
si je teste if($num_of_rows>0) est-ce que ça suffit pas pour dire que l'agent participe à deux missions en cours ?
Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part num_of_rows = $sql->rowCount() ;
bonjour,
Pour plus de clarté, il est préférable de distinguer les prédicats de filtrage positionnés dans le WHEREde ceux de jointure à positionner dans le JOIN.
Exemple :
Ensuite, si vous voulez connaitre le nombre de missions en cours pour un agent mais que vous n'avez pas besoin des éléments de chaque mission, il est préférable de compter les missions avec COUNT().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT miss_agt.mission_id FROM mission_agents miss_agt inner join missions miss on miss.mission_id = miss_agt.mission_id where miss.arrivee_mission >= CURDATE() and miss_agt.agent_id=? ;
Çà évitera de transporter des valeurs de colonnes inutiles.
Si vous avez besoin des éléments liés à chaque mission, vous devrez passer par un curseur.
Bonjour,
J'ai effectivement besoin si l'agent participe à des missions en cours ,de connaitre les éléments de la mission(missions en cous) pour voir si chaque mission en cours n'est pas en chevauchement avec des d'autres missions auxquels l'agent participe.
Ensuite je mets dans un tableau array() toutes les missions en chevauchement de l'agent.
Voici mon code( à voir si elle est correcte)
Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 include('functions.php'); $bdd_mission_msas=connect(); $tab_mission_en_chevauchement = array(); $reponse_tous_agent = $bdd_mission_msas->query('SELECT agent_id FROM agent;'); while ($donnees_tous_agent = $reponse_tous_agent->fetch()) { $agent_id_tous=$donnees_tous_agent['agent_id']; $sql_missions_en_cours =$bdd_mission_msas->prepare('SELECT miss_agt.mission_id,miss.depart_mission,miss.arrivee_mission FROM mission_agents miss_agt inner join missions miss on miss.mission_id = miss_agt.mission_id where (miss.arrivee_mission >= CURDATE() and miss_agt.agent_id=?);'); $sql_missions_en_cours->execute(array($agent_id_tous)) ; $num_of_rows_missions_en_cours = $sql_missions_en_cours->rowCount() ; if ($num_of_rows_missions_en_cours>0) // L'agent partcipe au moins à une mission en cours { while ($resultat_missions_en_cours = $sql_missions_en_cours->fetch()); { $mission_id_de_lagent=$resultat_missions_en_cours['mission_id']; $date_depart_mission_en_cours=$resultat_missions_en_cours['depart_mission']; $date_arrivee_mission_en_cours=$resultat_missions_en_cours['arrivee_mission']; $sql_missions_en_chevauchement=$bdd_mission_msas->prepare('SELECT miss_agt_chevauch.mission_id FROM mission_agents miss_agt_chevauch inner join missions miss_chevauch on miss_chevauch.mission_id = miss_agt_chevauch.mission_id where (miss_chevauch.depart_mission<=? and miss_chevauch.arrivee_mission=>? and miss_agt_chevauch.agent_id=?) and miss_chevauch.arrivee_mission >= CURDATE() ;'); $sql_missions_en_chevauchement->execute(array($date_depart_mission_en_cours,$date_arrivee_mission_en_cours,$mission_id_de_lagent)) ; $num_of_rows_missions_en_chevauchement= $sql_missions_en_chevauchement->rowCount() ; if( $num_of_rows_missions_en_chevauchement>0) // L'agent partcipe à des missions en chevauchement { while ($resultat_missions_en_chevauchement = $sql_missions_en_chevauchement->fetch()); { array_push($tab_mission_en_chevauchement,$resultat_missions_en_chevauchement ['mission_id']); // Je mets les missions en chevauchement dans un tableau array } } } } }
En ce cas, inutile de passer par un curseur contre-performant, utilisez simplement la requête suivante
du coup ici on utilise une jointure INNER puisque seuls les chevauchement vous intéressent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 select T1.mission , T1.dtdeb , T1.dtfin , 'est en chevauchement avec' , T2.mission , T2.dtdeb , T2.dtfin from tab1 T1 inner join tab1 T2 on T2.mission > T1.mission and T1.dtdeb <= T2.dtfin and T1.dtfin >= T2.dtdeb order by T1.mission, T2.mission
Bonjour,
En fait je comprends pas dans la requête les termes : est en chevauchement avec' , T2.mission,T1.mission
Cela signifie que les deux missions ont au moins un jour en commun
Exemple :
Dans la même semaine la mission M1 commence le lundi et termine le jeudi et la mission M2 commence le mercredi et termine le vendredi.
Dans cet exemple, le mercredi et le jeudi sont en chevauchement.
En reprenant le jeu d'essai proposé dans ma réponse n°5, à savoir
La requête
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 with tab1 (mission, dtdeb, dtfin) as (select 'Mission 01', '2019-02-01', '2019-02-04' union all select 'Mission 02', '2019-02-01', '2019-02-02' union all select 'Mission 03', '2019-02-03', '2019-02-05' union all select 'Mission 04', '2019-02-01', '2019-02-04' union all select 'Mission 05', '2019-02-08', '2019-02-09' union all select 'Mission 06', '2019-02-12', '2019-02-15' union all select 'Mission 07', '2019-02-14', '2019-02-16')
a pour résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 select T1.mission , T1.dtdeb , T1.dtfin , 'est en chevauchement avec' , T2.mission , T2.dtdeb , T2.dtfin from tab1 T1 inner join tab1 T2 on T2.mission > T1.mission and T1.dtdeb <= T2.dtfin and T1.dtfin >= T2.dtdeb order by T1.mission, T2.mission ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 mission dtdeb dtfin est en chevauchement avec mission dtdeb dtfin Mission 01 2019-02-01 2019-02-04 est en chevauchement avec Mission 02 2019-02-01 2019-02-02 Mission 01 2019-02-01 2019-02-04 est en chevauchement avec Mission 03 2019-02-03 2019-02-05 Mission 01 2019-02-01 2019-02-04 est en chevauchement avec Mission 04 2019-02-01 2019-02-04 Mission 02 2019-02-01 2019-02-02 est en chevauchement avec Mission 04 2019-02-01 2019-02-04 Mission 03 2019-02-03 2019-02-05 est en chevauchement avec Mission 04 2019-02-01 2019-02-04 Mission 06 2019-02-12 2019-02-15 est en chevauchement avec Mission 07 2019-02-14 2019-02-16
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