addition durées

kermoa
Invité n'ayant pas de compte PHPfrance

20 avr. 2005, 10:19

bonjour,
j'ai fais une requete sur une base ou j'ai recuperé dans un tableau toutes les durées correspondantes a une personne (du type HH:MM:SS)
je souhaiterais additionner l'ensemble des valeurs du tableau.

Exemple :
$row[0]=00:02:56
$row[1]=00:00:23
$row[2]=00:01:16
$row[3]=00:00:04

il faudrai que je recupere 00:04:39

si vous savez comment faire...

Merci d'avance

Eléphant du PHP | 440 Messages

20 avr. 2005, 10:33

Je pense que si tu les converties en secondes pour commencer ça sera mieu !

ensuite tu utilise la commande "SELECT SUM" de sql sur les colonnes et les lignes desirees.

Petit nouveau ! | 2 Messages

20 avr. 2005, 10:46

Bonjour,

Il n'y a pas de fonction qui permette d'effectuer cette opération simplement.

Il faut donc séparer les heures, minutes et secondes (par exemple avec la fonction explode()), effectuer les opérations nécessaires pour obtenir un nombre total de secondes, puis formater le résultat.

Mais peut-être que la meilleure solution se situe en amont, au niveau de votre base de données. Etes-vous certain d'avoir besoin des données au format HH:MM:SS à ce niveau ? Ne vaudrait-il pas mieux y stocker simplement le nombre de secondes (nombre entier), et effectuer la conversion au format HH:MM:SS au dernier moment, dans le PHP ?

kermoa
Invité n'ayant pas de compte PHPfrance

20 avr. 2005, 11:29

merci pour vos reponses
j'ai finalement enregistré la durée sous 2 formes dans la BD : forme HH:MM:SS et un autre champ contenant le nombre de secondes l'un pour la lisibilité, l'autre pour travailler dessus(en faisant un explode et en multipliant le champ HH par 3600, le champ MM par 60...)

ViPHP
pjl
ViPHP | 2119 Messages

20 avr. 2005, 11:51

et pourquoi ce ne serait pas la requête qui ferait le calcul plutôt que de le faire en PHP ??

Petit nouveau ! | 9 Messages

20 avr. 2005, 12:31

vloila un de but de solution [php]
// si chaine
$row[0]='00:02:56';
$row[1]='00:00:23';
$row[2]='00:01:16';
$row[3]='00:00:04';
//01:34:67
$t = 0;

for ( $i =0 ; $i < count($row); $i++) {
$t += (($row[$i][0] . $row[$i][1]) * 3600) +(( $row[$i][3] . $row[$i][4]) * 60) + ($row[$i][6] . $row[$i][7] );

//ou avec un explose explode(':' + $row)
}

// affichage methode 1
// nota si plus de 24H mache plus cette funcion
print strftime('%H:%M:%S', $t-3600);
// pour passe les +24h
// ou methode2
print '<br>';

print ( ( $H = (int) abs( ($t/ 3600)) ) == 0 ? '00:' : ( $H <10 ? ( '0' . $H . ':' ) : ($H . ':') ) );
print ( ( $M = (int) abs( ( ($H*3600 - $t) / 60 )) ) == 0 ? '00:' : ( $M <10 ? ( '0' . $M . ':' ) : ($M . ':') ) );
// il manque les seg
/*
a vous :-)
sortie html >>
si
$row[0]='00:02:56';
$row[1]='00:00:23';
$row[2]='00:01:16';
$row[3]='00:00:04';
00:04:39 < - methode 1
00:04: < - methode 2

$row[0]='00:02:56';
$row[1]='05:00:23';
$row[2]='00:01:16';
$row[3]='00:00:04';
05:04:39
05:04:

$row[0]='00:02:56';
$row[1]='05:00:23';
$row[2]='00:01:16';
$row[3]='20:00:04';
01:04:39
25:04:
*/ [/php]

ViPHP
pjl
ViPHP | 2119 Messages

21 avr. 2005, 14:16

Visiblement la réponse de DarkBlue n'a pas été lue. :roll:

ALors pour éviter les usines à gaz (pour ceux qui ne sont pas payés à la ligne de code), ca tient en une et une seule requête SQL et celà sans avoir besoin de faire la moindre modif dans sa base de données :

Code : Tout sélectionner

SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( heure ) ) ) FROM `test`
Attention au format du champ. Ca marche très bien avec un champ au format TIME, ca donne un résultat complètement faux avec un champ au format TIMESTAMP. Au format DATE, ca donne 0 et au format DATETIME, le calcul ignore les jours, mois et années.
Et la réponse se trouvait dans la doc. :roll:
http://www.nexen.net/docs/mysql/annotee ... ?lien=date

Petit nouveau ! | 9 Messages

22 avr. 2005, 15:01

dsl pas vue que c etait un du type HH:MM:SS penser que c etait srt*. on ma dit une fois etre juger c est ce juger. a+

Eléphant du PHP | 440 Messages

25 avr. 2005, 23:52

merci pjl je me sentais pas compris !