[Resolvido] Soma de intervalos de tempo - PHP - Portugal-a-Programar
[Resolvido] Soma de intervalos de tempo
By rfrancisco,
Tenho como objectivo registar vários tempos decorridos entre determinadas acções, ou seja, registar o tempo de início de uma acção, registar o tempo de fim (data e tempo) e no fim registar a diferença de anos, meses, dias, horas, minutos e segundos entre os dois registos.
Data Final - Data Inicial = Diferença entre as datas
Mas a mesma acção pode ter vários intervalos, pode ser Iniciada e interrompida várias vezes, o que quero é somar esses intervalos todos e registar o tempo total que a acção durou.
Tenho o código abaixo, que adaptei, mas não sei qual a melhor forma de fazer isto.
Na tabela tracks, registava o tempo inicial, o tempo final e a diferença entre as duas e depois noutra tabela o valor final da duração da mesma.
Qual seria a melhor forma para fazer isto?
$select_time= mysql_query('SELECT * FROM tracks WHERE line_id = "17"') or die(mysql_error());
while($result = mysql_fetch_array($select_time))
$date2 = strtotime($result['time_ini']);
$date1 = strtotime($result['time_end']);
echo "A diferença entre ".date('Y-m-d H:i:s',$date1)." e ".date('Y-m-d H:i:s',$date2)." is:<br><br>";
echo round($y)." years<br>";
echo $d." days<br>";
echo $h." hours<br>";
echo $m." minutes<br>";
echo $s." seconds<br>";
$time = $y.'-'.$d.'-'.$h.'-'.$m.'-'.$s; //exemplo
$query_time = mysql_query('INSERT INTO time (tempo) VALUES ("'.$time.'")') or die (mysql_error());
Onde é que estás a somar a diferença entre todos os intervalos?
Talvez fosse boa ideia calcular logo a diferença de tempos na BD, usando o TIMESTAMPDIFF, e devolver apenas isso no SELECT. Se não for necessário imprimir as diferenças de cada intervalo, até podes fazer a soma na query.
Ainda não consegui definir exactamente como fazer o que necessito, não tenho a parte da soma definida.
A ver se percebi, o que sugeres é calcular a diferença entre as duas datas e registar na bd com o TIMESTAMPDIFF.
Não preciso propriamente de apresentar os intervalos mas queria que ficassem registados, se ficar registada a diferença, e depois conseguir somar essas diferenças é mesmo isso.
Estive a ver o exemplo no fim do artigo - http://goo.gl/2Pqt46
A soma que falas na query é que não conheço...
O TIMESTAMPDIFF é uma operação que te calcula a diferença entre duas datas em MySQL.
A ideia era, imaginado que tens a tabela:
usar uma query que te devolvia a tabela:
Isto é facilmente feito usando o TIMESTAMPDIFF(SECOND, ini, end).
Se apenas precisares do total, então até podes usar um SUM para obter logo uma tabela com uma única linha com o total das diferenças:
(Em princípio ainda podias ir mais longe, e inserir logo o valor total na BD. Mas tenta fazer o resto primeiro.)
Vou testar aqui, depois reporto!
Bom, então fiz assim:
Dentro de um while fui buscar as duas datas que insiro na bd.
echo '--> '.$date1 = $query_select_time_assoc['ini_time'].'<br><br>';
echo '--> '.$date2 = $w_select_time2['end_time'].'<br><br>';
$result = mysql_query("SELECT TIMESTAMPDIFF(SECOND,'$date1','$date2')");
echo $timediff = $row["TIMESTAMPDIFF(SECOND,'$date1','$date2')"];
A seguir introduzo a diferença num campo em cada linha da tabela referente ao intervalo avaliado.
Depois na consulta faço a soma "normal" destes valores e converto para anos, meses, dias, horas, minutos e segundo.
Não sei se apliquei o timestampdiff da melhor forma, mas foi o que encontrei e funcionou.
Edited November 11, 2013 by rfrancisco
Sabes o que é que a seguinte query faz?
SELECT (coluna1 + coluna2) AS SomaDasColunas1e2
Se não souberes, vê este exemplo.
Tu precisas de algo semelhante, mas em vez do +, usas o TIMESTAMPDIFF.
O que faz a query que escreveste é somar os dois valores directamente na consulta, entendo que estas a sugerir aplicar isto na consulta dos valores totais, certo?
Para fazer a soma dos valores que registei apliquei um while, mais linhas claro, mas vou aplicar esta para testar também.
Não entendi foi esta parte:
Ou a forma como estou a guardar os dados não é a melhor?
Não. Estou a sugerir isso para calculares as diferenças entre as datas. Ou seja, para substituir a primeira query (SELECT * FROM tracks WHERE line_id = "17").
Na minha query usei o + para somar os valores de duas colunas. Tu devias usar o TIMESTAMPDIFF para obter a diferença de tempo entre duas colunas. No PHP nunca devia aceder ao ini_time e ao end_time, pois a query devia devolver logo as diferença (da mesma forma, na query que eu usei, em vez de devolver coluna1 e coluna2 é devolvida a sua soma).
Tens aqui um exemplo ainda mais próximo do que precisas (pois usa - em vez de +). Olha para os valores que foram introduzidos na tabela tabela, e depois olha para o resultado, e tenta perceber o que é que ele significa.
Depois para substituir o while vais usar um SUM. Mas isso é o passo seguinte. Primeiro constrói a query que te dá uma tabela com as diferenças entre ini_time e end_time.
[Algumas mensagens deste tópico foram movidas para um novo tópico. Nesse tópico pode ser visto como usar o TIMEDIFF para calcular intervalos de tempo.]
Peço desculpa pela tardia resposta e obrigado pela separação das outras mensagens!
Bom, o que fiz foi:
$select_all_time = mysql_query('SELECT TIMESTAMPDIFF(SECOND, ini_time, end_time) AS time FROM tracks') or die(mysql_error());
while ($result = mysql_fetch_array($select_all_time))
echo $result['time'].'<br>';
Adicionando o id da linha já consigo ter a diferença de tempos de cada monitorização.
Agora quanto ao SUM que referes, em termos de sitaxe, onde é que viria na query?
Suponho que seja assim:
$select_all_time = mysql_query('SELECT SUM(TIMESTAMPDIFF(SECOND, ini_time, end_time)) AS time FROM tracks') or die('Erro 7: '.mysql_error());