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

Requêtes MySQL Discussion :

[SQL] Requête de calcul kWh par jour


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Par défaut [SQL] Requête de calcul kWh par jour
    Bonjour à tous,

    J'ai un petit soucis de compétences pour créer une requête SQL (d'ailleurs je ne suis pas certain que ça soit possible)
    Voici ma requête actuelle : (le -0.94 est pour corriger un état de mes sondes que je n'ai pas pu "resetter")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
    ROUND(MAX(`ConsoBureau-kWh`),2)-0.94 as `conso`,
    DATE_FORMAT(`timestamp`, "%d/%m/%Y") as `date`
    FROM `logs` 
    WHERE `timestamp` > DATE_SUB(CURDATE(),INTERVAL 7 DAY) 
    GROUP BY DAY(`timestamp`) 
    ORDER BY `timestamp` ASC
    Et le résultat :
    conso date
    0.52 17/07/2015
    0.55 18/07/2015
    0.77 19/07/2015
    3.72 20/07/2015
    5.93 21/07/2015
    8.81 22/07/2015
    Mon problème est d'arriver à avoir une nouvelle colonne qui contient la valeur du jour moins celle de la veille pour pouvoir sortir la consommation quotidienne.
    Soit :
    22/07 = 2.88
    21/07 = 2.21
    20/07 = 2.95
    etc.

    De plus, ma précédente requête, un peu lourde je l'admets, était ceci :
    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
    SELECT
    ( SELECT ROUND(MAX(`ConsoBureau-kWh`),3)-0.94 FROM `logs` WHERE DATE(`timestamp`) = DATE(CURDATE()) ) AS `max1`,
    ( SELECT ROUND(MAX(`ConsoBureau-kWh`),3)-0.94 FROM `logs` WHERE DATE(`timestamp`) = DATE(CURDATE())-1 ) AS `max2`,
    ( SELECT ROUND(MAX(`ConsoBureau-kWh`),3)-0.94 FROM `logs` WHERE DATE(`timestamp`) = DATE(CURDATE())-2 ) AS `max3`,
    ( SELECT ROUND(MAX(`ConsoBureau-kWh`),3)-0.94 FROM `logs` WHERE DATE(`timestamp`) = DATE(CURDATE())-3 ) AS `max4`,
    ( SELECT ROUND(MAX(`ConsoBureau-kWh`),3)-0.94 FROM `logs` WHERE DATE(`timestamp`) = DATE(CURDATE())-4 ) AS `max5`,
    ( SELECT ROUND(MAX(`ConsoBureau-kWh`),3)-0.94 FROM `logs` WHERE DATE(`timestamp`) = DATE(CURDATE())-5 ) AS `max6`,
    ( SELECT ROUND(MAX(`ConsoBureau-kWh`),3)-0.94 FROM `logs` WHERE DATE(`timestamp`) = DATE(CURDATE())-6 ) AS `max7`,
    ( SELECT ROUND(MAX(`ConsoBureau-kWh`),3)-0.94 FROM `logs` WHERE DATE(`timestamp`) = DATE(CURDATE())-7 ) AS `max8`,
    ( DATE_FORMAT(DATE(CURDATE()), "%d/%m/%Y") ) AS `date1`,
    ( DATE_FORMAT(DATE(CURDATE())-1, "%d/%m/%Y") ) AS `date2`,
    ( DATE_FORMAT(DATE(CURDATE())-2, "%d/%m/%Y") ) AS `date3`,
    ( DATE_FORMAT(DATE(CURDATE())-3, "%d/%m/%Y") ) AS `date4`,
    ( DATE_FORMAT(DATE(CURDATE())-4, "%d/%m/%Y") ) AS `date5`,
    ( DATE_FORMAT(DATE(CURDATE())-5, "%d/%m/%Y") ) AS `date6`,
    ( DATE_FORMAT(DATE(CURDATE())-6, "%d/%m/%Y") ) AS `date7`,
    ( DATE_FORMAT(DATE(CURDATE())-7, "%d/%m/%Y") ) AS `date8`
    Elle devrait me donner les mêmes chiffres que la première non ? parce que j'ai ces résultats :
    max1 max2 max3 max4 max5 max6 max7 max8 date1 date2 date3 date4 date5 date6 date7 date8
    8.820 5.930 3.720 0.770 0.550 0.520 NULL NULL 22/07/2015 21/07/2015 20/07/2015 19/07/2015 18/07/2015 17/07/2015 16/07/2015 15/07/2015

    Donc du coup, la question est de savoir quelle est celle qui est censée me donner la bonne valeur ? Et si je peux obtenir ma consommation quotidienne avec l'une ou l'autre (dépend de ce qui est le mieux pour MySQL sachant que j'ai un enregistrement par minute dans cette table)

    EDIT : la structure des champs en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --
    -- Structure de la table `logs`
    --
     
    CREATE TABLE IF NOT EXISTS `logs` (
      `id` int(4) NOT NULL AUTO_INCREMENT,
      `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `ConsoBureau-kWh` float NOT NULL,
      PRIMARY KEY (`id`),
      KEY `timestamp` (`timestamp`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8758 ;
    Merci d'avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 87
    Par défaut
    Hello,

    Quel est le type du champ ConsoBureau-kWh?
    Parce que les opérations arithmétiques sur des float ont des effet assez pervers et aboutissent en général à des problèmes d'arrondi quasi-systématique, du fait du mode de stockage d'un float en base.

    Sinon pour obtenir une conso quotidienne, sans avoir besoin de la stocker quelque part tu peux faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT MIN(L2.`ConsoBureau-kWh`) - MIN(L1.`ConsoBureau-kWh`) DATE(L1.`timestamp`) 
    FROM `LOGS` L1
    	INNER JOIN `LOGS` L2
    		ON DATE(L1.`timestamp`) = DATE_SUB(DATE(L2.`timestamp`), INTERVAL 1 DAY)
    		AND DATE(L1.`timestamp`) >= DATE_SUB(DATE(CURDATE()), INTERVAL 7 DAY)
    GROUP BY DATE(A.DATE_DEBIT);
    Tu récupères la consommation minimale pour un jour donnée (théoriquement à 00:00:00 si t'as une ligne par minute) à laquelle tu soustrait la consommation minimale du jour suivant (pour bien prendre en compte la consommation entre 23:59:00 et 00:00:00).

    Y'a surement moyen de faire mieux ou plus propre, si c'est le cas les puristes du SQL passeront bien par là.

    Cdlt,
    Mvk

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Par défaut
    Hello,
    Merci de la réponse, je vais creuser du coté d'une joiture.

    C'est effectivement du float.

    Du fait que le script qui intègre ces données est effectué par un cron que je ne maitrise pas totalement, le timestamp (format timestamp) de la dernière valeur peut être entre 23:59:00 et 23:59:15

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Citation Envoyé par LiPeR Voir le message
    Elle devrait me donner les mêmes chiffres que la première non ? parce que j'ai ces résultats :
    hmmm, ce sont bien les même données non ? (à l'exception de la valeur pour la date du jour qui est légèrement supérieure, mais on peut supposer que des nouvelles données était arrivée entre l’exécution de la première requete et de la deuxième)

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,hmmm, ce sont bien les même données non ? (à l'exception de la valeur pour la date du jour qui est légèrement supérieure, mais on peut supposer que des nouvelles données était arrivée entre l’exécution de la première requete et de la deuxième)
    La même base, même table, même moment en effet

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    non, je voulais dire que les chiffres de votre premier résultat correspondent aux chiffres de votre deuxième tableau : les deux requêtes vous renvoient bien les même données.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Par défaut
    En effet, je me suis fait avoir avec le nbre de décimales

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/07/2009, 11h06
  2. [SQL] Comment utiliser dans une requête une variable passée par URL
    Par foffa dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 31/08/2006, 13h27
  3. [SQL] Nombre de connexion par jour
    Par Oberown dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/10/2005, 16h52
  4. Entrée aléatoire par jour SQL/ASP
    Par glidez dans le forum ASP
    Réponses: 3
    Dernier message: 28/09/2005, 18h17
  5. [Petite requête] Nombre de transactions par jour
    Par Braim dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/04/2003, 11h53

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