2013-08-11 3 views
3

J'ai une colonne dans une de mes tables, qui est le format TIME (00:00:00). J'essaye de résumer la colonne entière et l'affiche comme la même chose (00:00:00).colonne de temps de sommation dans mysql

J'ai essayé d'utiliser ce qui suit, mais il ne me donne pas partout près de la answer.It de me donner correcte 22,12: 44: 00 et calcaulation manuel me dit qu'il devrait être proche de 212: quelque chose: quelque chose

SELECT SEC_TO_TIME (SUM (TIME_TO_SEC (vluchttijd))) COMME TOTAL FROM tbl_vluchtgegevens

Des recommandations?

+0

Cette logique semble son. Pouvez-vous publier des données spécifiques qui semblent échouer? Et pouvez-vous clarifier la sortie? Cela ne semble pas être dans le bon format. – cmbuckley

+0

Toutes les données de la table semblent correctes. Rien ne semble déranger ou causer un quelconque échec de ce que je peux dire. données de l'échantillon comprend: 09:00:00, 01:00:00, 07:50:00, 12:00:00, 08:30:00, 00:45:00, 12:10:00 - ces valeurs seules devrait être beaucoup plus élevé même que ce que je reçois. –

Répondre

3

Vous pouvez essayer comme ceci: -

SELECT SEC_TO_TIME(SUM(SECOND(vluchttijd))) AS totaltime FROM tbl_vluchtgegevens; 

ou essayer (althoug ce n'est pas une bonne approche):

SELECT concat(floor(SUM(TIME_TO_SEC(`vluchttijd `))/3600),":",floor(SUM(TIME_TO_SEC(`vluchttijd `))/60)%60,":",SUM(TIME_TO_SEC(`vluchttijd `))%60) AS total_time 
FROM tbl_vluchtgegevens; 

Edit: -

Essayez ceci: -

select cast(sum(datediff(second,0,dt))/3600 as varchar(12)) + ':' + 
     right('0' + cast(sum(datediff(second,0,dt))/60%60 as varchar(2)),2) + 
     ':' + right('0' + cast(sum(datediff(second,0,dt))%60 as varchar(2)),2) 
from TestTable 

Fonctionnement SQL Fidlle

+0

cela donne un résultat de 0:00:00. hmmm. –

+0

Est-ce que cela résout votre but? :) –

+0

je reçois 0: 0: 0 comme résultat. –

0

En MySQL, le TIME type is rather limited in range. En outre, de nombreuses fonctions temporelles n'acceptent pas les valeurs supérieures à 23:59:59, ce qui les rend vraiment utilisables uniquement pour représenter le moment de la journée.

Compte tenu de vos besoins, votre meilleur pari est probablement écrire une fonction personnalisée qui imitent SEC_TO_TIME mais permettant portée beaucoup plus grande:

CREATE FUNCTION SEC_TO_BIGTIME(sec INT) 
RETURNS CHAR(10) DETERMINISTIC 
BEGIN 
    SET @h = sec DIV 3600; 
    SET @m = sec DIV 60 MOD 60; 
    SET @s = sec MOD 60; 

    RETURN CONCAT(
      LPAD(@h, 4, '0'), 
      ':', 
      LPAD(@m, 2, '0'), 
      ':', 
      LPAD(@s, 2, '0') 
    ); 

END; 

Et voici comment l'utiliser:

create table tbl (dt time); 
insert tbl values 
    ('09:00:00'), ('01:00:00'), ('07:50:15'), ('12:00:00'), 
    ('08:30:00'), ('00:45:00'), ('12:10:30'); 

select SEC_TO_BIGTIME(sum(time_to_sec(dt))) from tbl; 

La production:

+--------------------------------------+ 
| SEC_TO_BIGTIME(SUM(TIME_TO_SEC(DT))) | 
+--------------------------------------+ 
| 0051:15:45       | 
+--------------------------------------+ 

Voir http://sqlfiddle.com/#!8/aaab8/1

Veuillez noter que le résultat est un CHAR(10) afin de surmonter les limitations de type TIME. Selon la manière dont vous envisagez d'utiliser ce résultat, cela signifie que vous devrez peut-être convertir cette chaîne dans le type approprié dans votre langue hôte.

0

Cela a fonctionné pour moi:

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(vluchttijd))) AS totaltime FROM tbl_vluchtgegevens;