IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Calcul de consommation de compteurs pour afficher dans un graph


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2022
    Messages : 1
    Par défaut Calcul de consommation de compteurs pour afficher dans un graph
    Bonjour je suis un jeune developpeur debutant en php, j'utilise la version php 5, je suis en train de faire un projet auquel la base de données recupere les données de consommations de compteurs d'eau en fonction d puis je dois faire un calcul dans la requete entre le nouveau index et l'ancien index et afficher cette difference dans un graphique, j'utilise chart.js, le probleme c'est que c'est tres complexe comme calcul et j'ai deja essayé pleins de formes de clacul mais sans succées, exemple de resultat :
    Nom : Capture.JPG
Affichages : 211
Taille : 16,5 Ko

    Pour le code j'ai essayé directement avec un calcul de soustraction entre les deux valeurs mais comme c'est dans la requête impossible de stocker la variable puis j'ai vu avec la méthode lag mais comme j'utilise une version ancienne cette méthode ne fonctionne pas, du coup j'ai essayé avec cette méthode

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT i.*, @IndexReel := (ROUND((i.IndexReleve/i.ImpParUnit)) - @ancienIndex) as IndexReel, @ancienIndex := ROUND((i.IndexReleve/i.ImpParUnit)) as ancienIndex,DATE_FORMAT(DateHeure, '%d/%m/%Y %H:%i:%s') as DateHeure FROM Releves i,Emplacements CROSS JOIN ( SELECT @ancienIndex := '', @IndexReel := 0) as init

    mais cette partie ne fonctionne pas non plus du coup j'ai besoin de votre aide s'il vous plaît
    Je vous remercie d'avance

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 699
    Par défaut
    c'est surement possible de faire ce calcul dans la requete mysql mais d'habitude, je fais plutôt ces calculs en php comme dans le code suivant par exemple :
    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
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    <?php
     
    const JOUR_EN_SECONDES = 86400;
     
     
    // tableaux des données lues dans la base de données
    // date : secondes
    // index : m³
     
    $releves = [
    	[
    		"date" => 1644838969,
    		"index" => 35
    	],
    	[
    		"date" => 1646307769,
    		"index" => 46
    	],
    	[
    		"date" => 1647344569,
    		"index" => 61
    	],
    	[
    		"date" => 1649328169,
    		"index" => 101
    	],
    ];
     
     
    // calcul de la consommation moyenne qui sera stockées dans le tableau $releves
     
    $releve_precedent = NULL;
     
    foreach ($releves as $index_tableau => $releve) {
     
    	if (isset($releve_precedent)) {
     
    		$difference_index = $releve["index"] - $releve_precedent["index"];
    		$difference_date = ($releve["date"] - $releve_precedent["date"]) / JOUR_EN_SECONDES;
     
    		$consommation = $difference_index / $difference_date; // résultat en m³*/*jour
     
     
    		// stockage du résultat du calcul
     
    		$releves[$index_tableau]["consommation"] = $consommation;
     
    	}
     
    	// stockage du relevé en cours qui sera utilisé pour le relevé suivant
    	$releve_precedent = $releve;
     
    }
     
     
    // affichage des résultats
     
     
    $format_date = new IntlDateFormatter(
    	  "fr-FR"
    	, IntlDateFormatter::FULL
    	, IntlDateFormatter::FULL
    	, "Europe/Paris"
    	, IntlDateFormatter::GREGORIAN
    	, "EE dd/MM"
    );
     
     
    ?>
     
    <ul>
     
    	<?php foreach ($releves as $index_tableau => $releve) {?>
     
    		<li>
    			<ul>
    				<li>
    					Date du relevé*:
    					<?php h($format_date->format($releve["date"]));?>
    				</li>
    				<li>
    					Index (m³)*:
    					<?php h(number_format($releve["index"], 2, ",", " "));?>
    				</li>
     
    				<?php if (isset($releve["consommation"])) {?>
     
    					<li>
    						Consommation depuis le relevé précédent (m³*/*jour)*:
    						<?php h(number_format($releve["consommation"], 2, ",", " "));?>
    					</li>
     
    				<?php }?>
     
    			</ul>
    		</li>
     
    	<?php }?>
     
    </ul>
     
     
    <?php
     
    function h($v)
    {
    	echo htmlspecialchars($v);
    }

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    À partir de la version 8 de Mysql les fonctions fenêtrées ont été ajoutées (avec 10 ans de retard, mais mieux vaut tard que jamais )

    Ce qui permet de calculer le résultat très simplement comme suit :

    Code SQL : 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
    create table T1
          (  T1ident integer unsigned  auto_increment primary key 
           , T1val   decimal(5,0)      not null
           , T1dte   date              not null
          )
    ;      
    insert into T1
          (T1val, T1dte)
    values (010, '2021-12-14')
         , (022, '2021-12-18')
         , (015, '2021-12-21')
         , (008, '2021-12-22')
         , (030, '2021-12-30')
    ;
    select T1val      as compteur
         , T1dte      as dte
         , sum(T1val) over(order by T1dte) as cumul
    from  T1
    order by T1dte
    ;

    Résultat :
    compteur dte cumul
    10 2021-12-14 10
    22 2021-12-18 32
    15 2021-12-21 47
    8 2021-12-22 55
    30 2021-12-30 85

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/03/2009, 08h07
  2. Réponses: 14
    Dernier message: 05/05/2008, 15h35
  3. Liaison 2 tables pour afficher dans un datagridview
    Par manzione_vb dans le forum VB.NET
    Réponses: 9
    Dernier message: 17/03/2008, 10h55
  4. Texte trop long pour afficher dans une combobox
    Par bavmorda1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/02/2008, 13h42
  5. Thread pour afficher dans une CListCtrl
    Par gaudi dans le forum MFC
    Réponses: 14
    Dernier message: 10/08/2006, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo