2011-10-12 5 views
3

Dans ma base de données, les heures sont stockées en tant que "datetimes" (je ne sais pas si c'est le problème ou non - j'ai essayé à la fois datetime et timestamp). La structure ressemble à:Problème avec mysql SUM de plusieurs dates

ID | START_DATE   | END_DATE 
1 | 2011-10-10 08:15:00 | 2011-10-10 12:00:00 
2 | 2011-10-11 09:00:00 | 2011-10-11 14:30:00 
3 | 2011-10-12 08:45:00 | 2011-10-12 10:15:00 

J'essaie d'obtenir la somme des secondes totales entre toutes les heures de début et de fin. Voici ce que j'ai:

$times = mysql_query("SELECT SUM(TIMEDIFF(end_date, start_date)) 
AS timesum FROM schedules"); 

$timetotal = mysql_fetch_assoc($times); 

echo $timetotal['timesum']; 

Maintenant, la somme devrait être 38700, mais quand je lance la requête ci-dessus, il retourne 100500. Quel est le problème avec la requête?

+0

'100500' est le total d'ajouter tous les enregistrements d'agenda ainsi: http: // www. sqlize.com/91Ypqt7Ylf. En outre, les valeurs de chaque programme sont respectivement "34500", "53000" et "13000". D'où obtenez-vous le '38700'? http://www.sqlize.com/5IlL9a9cOa – mellamokb

+0

Je l'ai juste répercuté sur l'écran et la valeur est correcte. sch_id est un autre champ dans la table, j'essayais juste de le garder simple pour ce post. – Oseer

+0

Oh, je l'ai eu en quelques secondes. La réponse de ManseUK ci-dessous a résolu le problème. Je vous remercie. – Oseer

Répondre

8

Vous ne pouvez pas résumer les valeurs datetime - vous devez convertir en secondes premières ....

SELECT SUm(time_to_sec(TIMEDIFF(end_date, start_date))) 
AS timesum FROM schedules 
+0

Merci qui l'a fait. – Oseer

+0

+1 En effet vous avez raison: http://www.sqlize.com/G1lb3L6YdW – mellamokb

+0

Première fois que j'ai vu http://www.sqlize.com/ - quel site génial! – ManseUK

2

Vous devez convertir votre TIMEDIFF en secondes en utilisant la fonction TIME_TO_SEC pour obtenir correctement la somme en termes de secondes:

$times = mysql_query("SELECT SUM(TIME_TO_SEC(TIMEDIFF(end_date, start_date))) 
     AS timesum FROM schedules") 

sans convertir explicitement secondes avec TIME_TO_SEC la fonction SUM traite un TIMEDIFF en tant que nombre à virgule flottante. Faites un essai sur votre première ligne pour voir ce que je veux dire:

$times = mysql_query("SELECT SUM(TIMEDIFF(end_date, start_date)) 
     AS timesum FROM schedules WHERE ID='1'") 

devrait céder:

$times = 34500.000000