[MYSQL 5.0] datetime arrondi

datetime arrondi [MYSQL 5.0] - SQL/NoSQL - Programmation

Marsh Posté le 23-01-2008 à 12:48:51    

Bonjour,
 
je cherche à arrondir la valeur d'un date time :
* au quart d'heure
* à l'heure
* au mois
pour faire de l'aggrégation sur mes valeurs.
 
J'avais jusqu'ici une méthode assez simple pour les deux premiers cas.
 
ex pour l'arrondi au quart d'heure :

Code :
  1. SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(ihm_valve_date) div 900* 900) as date,source,min(time),max(time),avg(time)
  2. from stats
  3. group date, source


 
mais malheureusement les mois ne comportent pas tous 31 jours...

Reply

Marsh Posté le 23-01-2008 à 12:48:51   

Reply

Marsh Posté le 23-01-2008 à 12:50:34    

Bah tu récupères le mois et l'année, et tu recréées un champ date correspondant au 1er de ce mois et cette année...je connais pas assez mysql pour te dire quelles sont les fonctions à utiliser, mais le principe est simple...ou alors ce n'est pas vraiment ce que tu veux?


Message édité par skeye le 23-01-2008 à 12:51:22

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 23-01-2008 à 13:20:34    

RTFM : http://dev.mysql.com/doc/refman/5. [...] tions.html
DATE_FORMAT
EXTRACT
MONTH
YEAR
 
DATE_FORMAT te permet d'arrondir comme t'as envie (sauf arrondis au quart d'heure) mais transforme en chaine de caractère (comparaisons plus lentes)
EXTRACT te permet d'obtenir la même chose mais ne permet pas de récupérer en même temps le "mois+année", et le "jour+heure". (donc utile uniquement pour le regroupement par mois)
MONTH et YEAR (et autres équivalent, voir doc) te permettent de travailler sur des nombres mais demandent deux comparaisons (un sur le mois, un sur l'année)
 
A noter que dans tous les cas ces fonctions empêche l'utilisation d'un index pour le regroupement (donc la requête peut être très longue sur les très grosses tables)

Reply

Marsh Posté le 23-01-2008 à 13:50:56    

omega > oui, j'ai peur pour les perfs

Reply

Marsh Posté le 23-01-2008 à 14:35:28    

Côté performance, il n'y a pas 36 solutions de toute manière :
1) limiter le nombre de données à traiter : en séparant les données récentes des données anciennes (utilisation de deux tables de même structure) ou en stockant les résultats déjà calculé (ce qui fait qu'on a besoin que les données postérieure à une date/heure donnée ce qui permet d'utiliser les index pour savoir ce qu'on doit traiter)
2) stocker les dates/heures arrondis (ce qui permet de mettre des index et d'éviter le temps de calcul au moment du traitement)
3) utiliser une table temporaire à laquelle on rajoute des index sur les colonnes correspondant aux dates/heures arrondis

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed