Page 1 sur 1

Chronometre temps en miliseconde

Posté : 10 mai 2008, 01:49
par spiff
Bonjour,
n'ayant pas trouvé solution a mon problème, je me tourne vers vous qui pouvez (peut-être) éclairer ma lenterne.

Je suis en création de code PHP/MySQL qui me permetrait d'entrer le temps d'une spéciale de rallye par pilote au format minutes:secondes.milisecondes (3chiffres après la virgule, exemple : 6:52.328).

Le code PHP permettant de réaliser ceci étant déjà terminé, je bloque sur le stockage de mon temps dans ma base de donnée MySQL 5.0.51a.

Ma question est la suivante :
comment doit-je définire le champs de ma table, disons 'temps', pour qu'il accepte ce type de format ?


merci d'avance pour vos réponses !

Posté : 10 mai 2008, 02:42
par Cyrano
Je serais tenté de suggérer deux colonnes : la première de type TIME pour minutes et secondes et la seconde de type SMALLINT pour les millisecondes. Pour un simple SELECT, tu pourras toujours utiliser un CONCAT() sur les deux colonnes. Les tris ou les classements ne devraient pas poser de problèmes non plus avec par exemple un ORDER BY sur ces deux colonnes. Reste que pour les totaux, ça va poser un autre genre de problème, mais rien de vraiment insurmontable à mon avis :-k

Posté : 10 mai 2008, 11:40
par spiff
Très bonne idée a laquelle je n'avais pas pensé !

je vais faire comme sa c'est très bien merci beaucoup !

Posté : 10 mai 2008, 11:46
par Cyrano
N'oublie pas le [Résolu] (en haut a gauche de ce sujet)

Posté : 10 mai 2008, 11:57
par zeus
Modération :
spiff, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.


C'est bon Cyrano, on s'en occupe ;)

Posté : 14 mai 2008, 13:58
par caroube
cela dit, il n'est pas non plus difficile de stocker les temps en millisecondes et d'avoir une fonction qui transforme de millisecondes en mn:sec:mil et inversement.

Posté : 14 mai 2008, 14:03
par Cyrano
cela dit, il n'est pas non plus difficile de stocker les temps en millisecondes et d'avoir une fonction qui transforme de millisecondes en mn:sec:mil et inversement.
Pas faux mais pourquoi se priver des fonctions natives de classement des SGBD sur les colonnes de types temporels ? :-k

Optimiser une base de données, c'est bien et même vivement recommandé, mais ça ne veut pas dire pour autant sous-employer sa puissance au profit de l'écriture de fonctions maison en PHP... ce qui serait plus long à faire et certainement pas toujours plus rapide à l'exécution.

Posté : 14 mai 2008, 16:01
par caroube
Pour faire simple :
- je ne pense pas que les données soient de type temporel, mais plutôt de type score numérique qui est affiché sous une forme temporelle uniquement pour des raisons de lisibilité.
- je ne suis pas sûr que faire un order by concat (date_format(minutesec, '%h:%i:%s', '.', cast(milli as char)) soit extrêmement efficace
- je n'y connais pas grand chose en rallye, mais pour afficher le tableau des classements avec la différence de temps entre chaque concurrent et le vainqueur de chaque spéciale, il va falloir convertir en millisecondes avant de faire la soustraction ; de même pour le temps cumulé de chaque spéciale pour établir le temps total du rallye. Donc, je pense que la conversion en millisecondes sera faite à un moment ou à un autre.
- quand je parle de fonctions qui convertissent milli->h:mn:sec:milli et inversement, je ne pensais pas forcément à des fonctions PHP, mais à des fonctions MySQL qui peuvent être utilisées dans les requêtes.
- enfin, j'imagine que pour un rallye donné (clause where), on va afficher les temps des 10 spéciales et des 20 pilotes, soit 200 résultats. Donc, à mon avis, la différence de performances (si elle est avérée) va être négligeable et personnellement, j'irai vers la méthode la plus rustique.

Ce qui est par contre dommage, c'est que la doc de MySQL parle de microsecondes, que la fonction date_format possède un argument pour afficher les microsecondes, mais quand on enregistre un temps avec des microsecondes, la partie fractionnaire (sous la seconde) ne soit pas stockée. Là encore, je pense que le stockage dans une seule colonne permettra de faire une évolution à moindre frais quand ces microsecondes seront implémentées.

Mais ce n'est qu'un avis :)

Posté : 14 mai 2008, 16:23
par Cyrano
je ne suis pas sûr que faire un order by concat (date_format(minutesec, '%h:%i:%s', '.', cast(milli as char)) soit extrêmement efficace
C'est évident, mais un "ORDER BY minutesec, milli" devrait parfaitement remplir la tâche avec un résultat tout à fait juste.
La concaténation, tu garde ça pour la partie SELECT pour récupérer ce que tu vas pouvoir afficher directement :-k