Ir para o conteúdo
rfrancisco

[Resolvido] Soma de intervalos de tempo

Mensagens Recomendadas

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

Editado por Rui Carlos
GeSHi

"bater código"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Editado por Rui Carlos

"bater código"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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:

[table]

ini end

[td]10:00[/td][td]10:02[/td]

[td]11:10[/td][td]11:11[/td]

[td]11:14[/td][td]11:18[/td]

[/table]

usar uma query que te devolvia a tabela:

[table]

diff

[td]120[/td]

[td]60[/td]

[td]240[/td]

[/table]

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:

[table]

total

[td]420[/td]

[/table]

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por rfrancisco

"bater código"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por Rui Carlos

"bater código"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.