Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formule complexe avec DateDiff My SQl

Sujet résolu
    3 juillet 2020 à 15:34:48

    Bonjour à tous,

    Voilà je dois faire un le calcul suivant : 

    ((nombre de pièces produites /temps passé) / (Objectif horaire)) X 100

    Pour le temps passé, je comptais utiliser un DateDIFF entre la variable 'Début' pouvant prendre les valeurs 5/13 ou 21 et la date actuelle now().

    Voici le code que j'ai pour le moment:

    SELECT CASE
        WHEN HOUR(now()) >= 5 and HOUR(now()) < 13 THEN 5
        WHEN HOUR(now()) >= 13 and HOUR(now()) < 21 THEN 13
        ELSE 21
    END AS Debut
    
    SELECT ((Qte/ DATEDIFF(Debut,now()))/86)*100 as Pourcentage ,SUBTIME(Datetimes,'01:00:00') as time FROM matable
    where id=xxxx AND Datetimes>'2020-07-03 00:00:00'
    order by datetimes

    Si quelqu'un a une idée cela m'aiderai vraiment car ça fait un moment que je suis dessus et à vrai dire je ne vois pas comment en venir à bout.

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      3 juillet 2020 à 16:55:23

      Bonjour,

      Pour commencer, la fonction DATEDIFF retourne un nombre de jours entre les deux dates données ... pas des heures ... Ton DATEDIFF correspond à ceci :

      SELECT DATEDIFF( 5 , now() );

      Exécute cette requête et tu obtiendras NULL car 5 n'est pas une date ...

      Ensuite dans ton exemple, l'alias "Debut" n'est pas une variable, donc n'est pas accessible dans une autre requête que celle où il a été défini ...

      Concernant ton problème, il semblerait que tu veuilles calculer le nombre de pièces produites par heure entre un "certain moment" et maintenant.

      Comment est stocké en base ce "certain moment" ? As-tu une colonne donnant une date/heure de début de production ?

      Peux-tu nous donner la structure de la table en question (colonnes et types) ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        4 juillet 2020 à 12:32:42

        Bonjours,

        tout d'abord merci pour l'explication de la fonction Datediff.

        En gros j'aimerai déclarer la variable Début qui prend comme valeur 5/13 ou 21 avec un if je suppose et calculer à un instant T la différence de temps entre la variable début et la date T afin de calculer le nombre de pièce produite par rapport à un objectif d'ou mon calcul.

        Justement ce certain moment doit prendre les valeurs de ma variable début en fonction de la condition IF. Dans ma DB j'ai une table date qui se raffraichi modulo 10 minutes.

        Mais il n'existe pas de table à proprement parler ou j'ai mon début et làa est tout mon problème.

        Merci d'avance 

        • Partager sur Facebook
        • Partager sur Twitter
          4 juillet 2020 à 19:26:54

          Et c'est quoi la colonne Datetimes que l'on voit dans la requête ?

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            6 juillet 2020 à 8:51:43

            Il s'agit de mes dates renvoyées toutes les 10mn
            • Partager sur Facebook
            • Partager sur Twitter
              6 juillet 2020 à 9:10:08

              Je ne comprends pas ... désolé ...

              Tu reçois toutes les 10 minutes une données qui dit le nombre de pièces fabriquées à l'instant t depuis 5, 13 ou 21 heures (en fonction de l'heure actuelle) ? Et tu veux donc calculer combien d'heures se sont écoulées entre 5, 13 ou 21 heures et maintenant ?

              Peux-tu donner un exemple de quelques lignes sur plusieurs dates et nous expliquer et donner le résultat attendu ?

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                6 juillet 2020 à 9:20:29

                Voici ce que j'obtiens pour le moment : 

                avec la requete : 

                SELECT (Qte/600)*100 as Qtepercent,SUBTIME(Datetimes,'01:00:00') as time FROM xxxxx
                where id=xxxxx AND Datetimes>'2020-07-04 00:00:00'
                order by datetimes
                

                Mon but est de pouvoir renvoyer le pourcentage en chaque 10 minutes mais pas sur un sur objectif à cet instant T .

                petit exemple de ce que j'aimerai avoir : 

                "On a produit 352 pièces à une date X et on aurait du avoir produit 375 à ce moment X

                On affiche une jauge qui indique 93,86% ( d'après la formule qui suit ou j'ai pris 4 pour le nombre d'heures passées)


                ((nombre de pièces produites /temps passé) / (Objectif horaire)) X 100 ""

                Cependant la variable temps passé doit calculer la différence entre chaque début de production 5 13 ou 21 et l'instant T car toutes les quantités sont remises à 0 à chaque début.

                Je ne sais pas si c'est un peu plus clair ...

                • Partager sur Facebook
                • Partager sur Twitter
                  6 juillet 2020 à 10:07:44

                  Donc pour calculer le nombre d'heures écoulées il ne faut pas utiliser NOW() mais bien la colonne Datetimes. Je te propose de travailler vraiment avec les types date et heure de MySQL pour profiter des fonctions inhérentes notamment TIMEDIFF.

                  On détermine à partir de la colonne Datetimes quel heure de début il faut prendre (5, 13 ou 21). Ici le CASE est adapté.

                  On détermine le nombre d'heures écoulées entre ce début et la valeur de la colonne Datetimes. Ici TIMEDIFF est adapté.

                  Pour calculer le temps écoulé entre le début et Datetimes :

                  SELECT
                  	Datetimes,
                  	Qte,
                  	
                  	CASE
                  		WHEN HOUR( Datetimes ) >= 5 AND HOUR( Datetimes ) < 13 THEN CONCAT( DATE( Datetimes ), ' 05:00' )
                  		WHEN HOUR( Datetimes ) >= 13 AND HOUR( Datetimes ) < 21 THEN CONCAT( DATE( Datetimes ), ' 13:00' )
                  		ELSE CONCAT( DATE( Datetimes ), ' 21:00' )
                  	END AS HeureDebut,
                  	
                  	TIME_TO_SEC( TIMEDIFF(
                  		Datetimes,
                  		CASE
                  			WHEN HOUR( Datetimes ) >= 5 AND HOUR( Datetimes ) < 13 THEN CONCAT( DATE( Datetimes ), ' 05:00' )
                  			WHEN HOUR( Datetimes ) >= 13 AND HOUR( Datetimes ) < 21 THEN CONCAT( DATE( Datetimes ), ' 13:00' )
                  			ELSE CONCAT( DATE( Datetimes ), ' 21:00' )
                  		END
                  	) ) / 3600 AS NbHeures,
                  	
                  	Qte / ( TIME_TO_SEC( TIMEDIFF(
                  		Datetimes,
                  		CASE
                  			WHEN HOUR( Datetimes ) >= 5 AND HOUR( Datetimes ) < 13 THEN CONCAT( DATE( Datetimes ), ' 05:00' )
                  			WHEN HOUR( Datetimes ) >= 13 AND HOUR( Datetimes ) < 21 THEN CONCAT( DATE( Datetimes ), ' 13:00' )
                  			ELSE CONCAT( DATE( Datetimes ), ' 21:00' )
                  		END
                  	) ) / 3600 ) AS QteHoraire,
                  	
                  	600 AS Objectif,
                  	
                  	Qte / ( TIME_TO_SEC( TIMEDIFF(
                  		Datetimes,
                  		CASE
                  			WHEN HOUR( Datetimes ) >= 5 AND HOUR( Datetimes ) < 13 THEN CONCAT( DATE( Datetimes ), ' 05:00' )
                  			WHEN HOUR( Datetimes ) >= 13 AND HOUR( Datetimes ) < 21 THEN CONCAT( DATE( Datetimes ), ' 13:00' )
                  			ELSE CONCAT( DATE( Datetimes ), ' 21:00' )
                  		END
                  	) ) / 3600 ) / 600 AS QtePercent
                  	
                  FROM ...
                  WHERE
                  	id = ...
                  	AND Datetimes > ...
                  ORDER BY Datetimes;

                  J'ai volontairement décomposé les étapes mais tu peux directement mettre le dernier calcul avec l'objectif horaire ;)

                  -
                  Edité par Benzouye 6 juillet 2020 à 10:08:20

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    6 juillet 2020 à 10:39:33

                    Cela affiche toutes les bonnes données sauf entre 00:00:00 et 5:00:00 à la remise à 0. aucune logique des données renvoyées.

                    peut-être qu'il faut prendre la date de la veille mais je ne sais pas vraiment comment l'ajouter 

                    -
                    Edité par PaulQuentin1 6 juillet 2020 à 11:35:44

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 juillet 2020 à 11:40:04

                      Et oui ... je n'avais pas pensé au changement de jour ... Du coup il faut rajouter une condition dans le CASE :

                      SELECT
                          Datetimes,
                          Qte,
                          Qte / ( TIME_TO_SEC( TIMEDIFF(
                              Datetimes,
                              CASE
                      			WHEN HOUR( Datetimes ) < 5 THEN CONCAT( DATE( Datetimes )-INTERVAL 1 DAY, ' 21:00' )
                      	        WHEN HOUR( Datetimes ) >= 5 AND HOUR( Datetimes ) < 13 THEN CONCAT( DATE( Datetimes ), ' 05:00' )
                      	        WHEN HOUR( Datetimes ) >= 13 AND HOUR( Datetimes ) < 21 THEN CONCAT( DATE( Datetimes ), ' 13:00' )
                      			WHEN HOUR( Datetimes ) >= 21 THEN CONCAT( DATE( Datetimes ), ' 21:00' )
                              END
                          ) ) / 3600 ) / 600 AS QtePercent
                      FROM ...
                      WHERE
                          id = ...
                          AND Datetimes > ...
                      ORDER BY Datetimes;

                      Si on est avant 5h le début est sur la journée d'avant (- INTERVAL 1 DAY).

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        6 juillet 2020 à 11:42:32

                        Merci pour toutes vos explications et du temps que vous prenez pour les détailler ;)

                        J'ai maintenant bien l'affichage dont j'avais besoin.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Formule complexe avec DateDiff My SQl

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown