Chronometre temps en miliseconde

Petit nouveau ! | 2 Messages

10 mai 2008, 01:49

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 !

Mammouth du PHP | 19672 Messages

10 mai 2008, 02:42

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 2 Messages

10 mai 2008, 11:40

Très bonne idée a laquelle je n'avais pas pensé !

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

Mammouth du PHP | 19672 Messages

10 mai 2008, 11:46

N'oublie pas le [Résolu] (en haut a gauche de ce sujet)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 mai 2008, 11:57

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 422 Messages

14 mai 2008, 13:58

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.

Mammouth du PHP | 19672 Messages

14 mai 2008, 14:03

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 422 Messages

14 mai 2008, 16:01

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 :)

Mammouth du PHP | 19672 Messages

14 mai 2008, 16:23

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: