Jump to content
rfrancisco

[Resolvido] Soma de intervalos de tempo

Recommended Posts

rfrancisco

Boa tarde,

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?

<?php
$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']);
$subTime = $date1 - $date2;
$y = ($subTime/(60*60*24*365));
$d = ($subTime/(60*60*24))%365;
$h = ($subTime/(60*60))%24;
$m = ($subTime/60)%60;
$s = ($subTime)%60;
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>";
echo '<br><br>';
$y = round($y);
$time = $y.'-'.$d.'-'.$h.'-'.$m.'-'.$s; //exemplo

$query_time = mysql_query('INSERT INTO time (tempo) VALUES ("'.$time.'")') or die (mysql_error());
}
?>

Obrigado,

Roberto Francisco

Edited by Rui Carlos
GeSHi

"bater código"

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
rfrancisco

Olá Rui,

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...

Edited by Rui Carlos

"bater código"

Share this post


Link to post
Share on other sites
Rui Carlos

O TIMESTAMPDIFF é uma operação que te calcula a diferença entre duas datas em MySQL.

A ideia era, imaginado que tens a tabela:

ini end
10:00 10:02
11:10 11:11
11:14 11:18

usar uma query que te devolvia a tabela:

diff
120
60
240

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:

total
420

(Em princípio ainda podias ir mais longe, e inserir logo o valor total na BD. Mas tenta fazer o resto primeiro.)

Share this post


Link to post
Share on other sites
rfrancisco

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')");

while($row=mysql_fetch_array($result))
{
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.

Qualquer sugestão é bem vinda.

Obrigado,

Roberto Francisco

Edited by rfrancisco

"bater código"

Share this post


Link to post
Share on other sites
Rui Carlos

Sabes o que é que a seguinte query faz?

SELECT (coluna1 + coluna2) AS SomaDasColunas1e2
FROM tabela

Se não souberes, vê este exemplo.

Tu precisas de algo semelhante, mas em vez do +, usas o TIMESTAMPDIFF.

Share this post


Link to post
Share on other sites
rfrancisco

Olá Rui,

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:

Tu precisas de algo semelhante, mas em vez do +, usas o TIMESTAMPDIFF.

Ou a forma como estou a guardar os dados não é a melhor?


"bater código"

Share this post


Link to post
Share on other sites
Rui Carlos

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. 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.

Share this post


Link to post
Share on other sites
rfrancisco

Olá Rui,

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());

Obrigado.

Edited by Rui Carlos

"bater código"

Share this post


Link to post
Share on other sites
rfrancisco

Sim, é exactamente isso. Com uma query consegues logo directamente o que precisas.

Muito obrigado Rui.


"bater código"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.