Intersection des plages datetime

cs_nitho Messages postés 130 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 8 décembre 2015 - 4 mai 2010 à 23:44
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 6 mai 2010 à 15:55
Bonjour à tous!
J'ai un problème de requête MySQL,
Dites j'ai quatre champs datetime: Début_action, Fin_action, Début_temps et Fin_temps.
J'aimerais savoir comment faire pour avoir l'intervalle de temps qui fait l'intersection.

Par exemple si on a
Début_action = 2010-05-02 10:00:00
Fin_action = 2010-05-02 18:00:00

Début_temps = 2010-05-02 06:00:00
Fin_temps = 2010-05-02 15:00:00

J'aimerais avoir l'équivalent en secondes de 5 Heures.

Et si au lieu de deux plages j'en ai 3 comment avoir la somme des intersections en secondes?

Merci d'avance.

nitho l'amateur

3 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
5 mai 2010 à 12:27
Salut,

Est ce bien raisonnable ??

Je sais que je ne réponds pas à ta question mais peux tu préciser le but ? Est ce pour sélectionner des données ? Autre chose ?
Que représentent les "début_action", ... "fin_temps" ?
Quelles valeurs peuvent prendre ces données ? N'y a t il pas des constantes du style : fin_action est toujours supérieur à fin_temps ?

Si je pose ces questions c'est pour tenter de comprendre le truc dans sa globalité, car il est peut être possible de faire plus simple.


Cordialement,


Kohntark -
0
cs_nitho Messages postés 130 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 8 décembre 2015
5 mai 2010 à 15:59
En fait je chercher à calculer la disponibilité des équipements d'une entreprise.

Pour une machine donnée, cette disponibilité est égale au rapport du nombre d'heures ou la machine a fonctionnée sur le nombre d'heures où elle était sensée fonctionner.

Admettons pour hypothèse simplificatrice que les machines ne s'arrête pendant les heures où elles sont sensées fonctionner qu'à cause des éventuelles pannes qui peuvent subvenir.

lorsqu'il y a panne, on remplit une fiche d'intervention qui nous renseigne sur la date et l'heure à laquelle est survenu la panne et la date et l'heure à laquelle l'intervention est achevée avec succès.

il faut remarqué que pour chaque jour on définit une ouverture qui correspond à la plage de temps pendant laquelle on veut que la machine fonctione.

Pour calculer la disponibilité d'une machine sur une période donnée, outre la somme des temps d'ouverture sur la période étudiée, j'ai besoin du temps pendant lequel la machine à effectivement travaillé.

Pour avoir le temps où la machine à effectivement travaillé, on va donc aller sur chaque enregistrement d'ouverture un par un en sachant qu'il y a une ouverture par jour. on lit l'ouverture, on recherche toutes les interventions qui ont traversées cette journée et si les horaires touchent aux heures d'ouvertures on soustrait l'intersection à l'ouverture.

Par exemple si pour une journée on a une ouverture allant de 6H à 16H, et qu'une intervention va de 15H à 18H, on va considéré d'aurénavant l'intervalle 6H - 15H. et on fait passer toutes les interventions relatives à cette journée de la même façon à la fin on se retrouve avec quelque chose comme 6H - 7H, on en déduit que la machine n'a effectivement travaillée cette journée que 1 Heure. On passe à la journée suivante et on fait la somme sur toute la période étudiée.

Au final je crois que je suis obligé de faire plusieurs requête (au début je voulais tout faire en une fois).

En fait j'ai besoin de calculer la disponibilité des équipements chaque mois. Je vais donc faire une première requête qui me donne toutes les ouvertures du mois (date et heure de début et de fin), et je cherche un moyen d'introduire chaque ouverture une par une avec la date concernée.

Il faudra donc que MySQL cherche toutes les interventions qui traverse cette journée, qu'il rogne l'ouverture grâce à tous les temps d'interventions, et qu'il me ramène le temps de fonctionnement de la machine en seconde (pas sous forme d'intervalles de temps).

Je sais que ça peut paraitre compliqué mais il suffit juste que je trouve les bons mots donc si quelqu'un ne comprend pas quelque chose qu'il pose la question. Je suis bloqué et j'ai besoin d'aide s'il vous plait.

nitho l'amateur
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
6 mai 2010 à 15:55
Je vois mieux ...
Je ne connais pas la structure de ta base mais, à mon humble petit avis la clé est dans sa construction.
La manière dont tu procèdes dans ton premier message me semble compliquée.

Le point noir que je vois est la possibilité qu'une "action" (intervention de dépannage) puisse être à cheval sur la plage d'ouverture (commencer avant, finir après). A mon sens ce n'est pas logique, ces interventions, pour leur parties hors plage, sont en temps masqué et n'ont pas à arriver dans ton calcul.

Je ne dis pas qu'il ne faut pas les consigner, mais simplement que l'impact production devrait être calculé avant, ce qui rendrait les choses bien plus simples par la suite. Pour être plus précis ça serait à cet instant :

lorsqu'il y a panne, on remplit une fiche d'intervention qui nous renseigne sur la date et l'heure à laquelle est survenu la panne et la date et l'heure à laquelle l'intervention est achevée avec succès.


Plutôt que d'entrer simplement l'heure de début de la panne et celle de sa résolution, tu fais (en plus) le calcul de l'impact production (cad temps d'arrêt réellement dans la plage d'ouverture), quitte à, pourquoi pas, ajouter un ou plusieurs champs dans la table concernée.
En décomposant au plus tôt :
- tu limites fortement la complexité qui, sans ça, existerait par la suite.
- tu ne limites pas les possibilités futures, comme des calculs de TRS hebdomadaires, journaliers, temps d'arrêt maintenance, pause, gestion MO, équipes ...

Ne connaissant rien de ton appli je parle sans doute dans le vide. Ce que je cherche à te dire là est qu'il est dans la majorité des cas préférable de traiter les pbs à la source. Celui que tu exposes est sans doute gérable, mais personnellement je pense qu'il tendra rapidement vers une usine à gaz si tu le traites en SQL.
Un ti dernier pour la route pour appuyer ça :
Tu trouves une super requête pour résoudre ton soucis (ce qui est sans doute réalisable).
Tout ce passe bien dans une ouverture 6h30 / 18h00 jusqu'au jour ou la panne arrive à 15h30 et se poursuit jusqu'au lendemain 0h03, ou plusieurs jours après, avec des reprises de production, des changements d'outillage, ... (et je sais de quoi je parle) ... j'aimerai voir la requête qui permet de gérer ça.
En traitant au plus proche (== on prend de suite en compte la plage d'ouverture, on traite par jour, ...) pas de pb.

une nouvelle fois désolé de ne pas répondre directement à ta question.

Quelle est ta structure actuelle ?

Bonne journée,


Kohntark -
0
Rejoignez-nous