Récupération de valeur SQL par saut de 30 secondes

Flashi -  
 Flashi -
Bonjour,

J'essaye de faire une truc tout bête mais je n'y arrive pas.
J'ai des valeurs dans une base sql qui s'enregistre toute les 2 secondes
avec ces valeurs je fais une graphique , mais comme il y beaucoup de valeur sur une journée cela mais a peut près 30 a 60 secondes pour générer un graphique sur une journée et encore si la requête n’échoue pas .

Je voudrais savoir si il est possible de récupérer des valeurs dans une base SQL mais espacer des 30 sec
par exemple 14:47:00 , 14:47:30 , 14:48:00 ect

Ma base dispose d'un timestamp, rec_date, rec_time , puis mes valeurs .

6 réponses

  1. Pitet Messages postés 2845 Statut Membre 530
     
    Salut,

    Un début de solution :
    SELECT * FROM table WHERE RIGHT(timestamp, 2) = '00' OR RIGHT(timestamp, 2) = '30'


    Bonne journée
    0
  2. Flashi
     
    Merci Cela fonctionne mais il y a un petite inconvénient c'est que si mon timestamp ne fini pas par 00 ou 30, parfois je n'ai pas de valeur pendant 1 heures .


    "SELECT timestamp, papp FROM tele where timestamp >= '$start' and timestamp <= '$stop' and RIGHT(timestamp, 2) = '00' OR RIGHT(timestamp, 2) = '30' ORDER BY 1 ";
    0
    1. Pitet Messages postés 2845 Statut Membre 530
       
      Quelque chose comme ceci peut être ?
      SELECT * FROM table WHERE timestamp >= '$start' AND timestamp <= '$stop' GROUP BY LEFT(timestamp, LENGTH(timestamp) - 2)
      
      0
  3. Flashi
     
    Parfait cela me fait des saut de 100


    1462723001 BASE : 1462723100 BASE : 1462723200 BASE : 1462723300 BASE


    Peux tu expliquer le code ?
    0
    1. Pitet Messages postés 2845 Statut Membre 530
       
      L'idée est de grouper les résultats selon le timestamp en omettant les deux derniers chiffres du timestamp (les seconde), on récupère ainsi uniquement le premier résultat pour chaque minute.
      Tu peux essayer ces requêtes pour t'aider à mieux comprendre :
      SELECT timestamp, LEFT(timestamp, LENGTH(timestamp) - 2) FROM table
      
      SELECT timestamp, LEFT(timestamp, LENGTH(timestamp) - 2) FROM table GROUP BY LEFT(timestamp, LENGTH(timestamp) - 2)
      


      Néanmoins, n'étant pas un expert sql, cette requête ne me semble pas complètement satisfaisante : on récupére un résultat toutes les minutes et non toutes les 30s et on ne sait pas quel est le résultat récupéré pour chaque groupe (le premier en bdd, le plus récent, ... ? peut être plus précis en ajoutant un order by ?).
      0
  4. Flashi
     
    Je ne pense pas que cela interférent car derrière je génère un graphique avec une boucle sur 24 heures avec

    where timestamp >= '$start' and  timestamp <= '$stop'
    


    Les sauts sont de 1 minutes mais cela fonctionne .

    Je n'ai pas encore assez de valeur pour essayer sur 1 semaine ou un mois.
    En parallèle j'ai fais un script qui se lance toute les 30 sec qui prend la dernière valeur ajoutée pour la remettre dans une autre table je vais comparer les deux et voir .

    Merci
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    Bonjour,
    Tu pourrais aussi utiliser du LIKE.
    Un truc du genre :
    SELECT taColonneTimeStamp
    FROM tatable
    WHERE taColonneTimeStamp like '%:%:3%' 
          OR taColonneTimeStamp like '%:%:0%'
    GROUP BY DATE_FORMAT(taColonneTimeStamp, '%Y-%M-%d %H:%i:%s')
    



    En parallèle j'ai fais un script qui se lance toute les 30 sec qui prend la dernière valeur ajoutée pour la remettre dans une autre table

    Pour le coup.. je pense que cette solution sera la plus fiable. Perso... je pense que c'est ce que j'aurais fait.

    EDIT : Il existe aussi la possibilité d'utiliser ce genre de syntaxe :
    SELECT   ROUND(UNIX_TIMESTAMP(taColonneTimeStamp)/(30 * 3600)) AS timekey
    FROM     tatable
    GROUP BY timekey;
    

    0
  7. Flashi
     
    Il faudrait que je regarde avec le temps, pour voir lesquelles serait le plus optimiser en charge sur le serveur .
    0