Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sergionpinheiro

Diferença e média entre horas

Recommended Posts

Boa noite galera,

 

Estou com um pequeno problema.

 

Tenho uma tabela que contem hora_entrada e hora_saida.

 

Quero fazer o seguinte:

 

Fazer a diferença e retorna quanto tempo tem entre as horas e depois fazer uma média entre todos os registros, ou seja, quero somar a diferença entre cada linha da tabela (hora_saida - hora entrada) e depois / pelo número de registros encontrados.

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uai, é só somar as diferenças e depois dividir pelo total de períodos. Em qual ponto exatamente se encontra a dificuldade? Na programação ou na matemática? :nataltongue:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é o problema, consigo somar quando retorna somente um registro, quando são vários, ele arredonda os valores e dá erro. Queria um exemplo de pegar a diferença entre hora de chegada e saída numa tabela com vários registros, depois pegar essa diferença, somar todas elas e fazer uma média entre as mesmas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente usar o floatVal para não arredondar. Dentro do laço que faz a consulta:

for(...){
    ...
    $calHoras +. floatVal($saida) - floatVal($entrada);
    $qtdIntervalos +. 1;
    ...
}

$media = $calHoras / $qtdIntervalos;

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está em dividir a hora. Tem que converter tudo em número (segundos por exemplo) e depois dividir. Então retorna para o formato de hora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode evitar ter que fazer os cálculos com o PHP! Você disse que as informações

vem de algum banco de dados certo? Então você pode manipula-las para chegarem

prontas.... Vou usar como exemplo o MySQL

 

retorna quanto tempo tem entre as horas

 

 

Para tal tarefa temos a função TIMEDIFF

SELECT TIMEDIFF(fim, inicio) AS intervalo from tabela;
fazer uma média entre todos os registros

 

Bem esse já é um pouco mais complexo, como o amigo MarceloBBT já comentou

temos que converter tudo para segundo, para isso temos a função TIME_TO_SEC,

já para realizar a média temos a função AVG que vem de average (média em inglês).

Então temos:

SELECT AVG(TIME_TO_SEC(inicio)) FROM tabela;

Porém ainda falta pegarmos o resultado e reconverter para o formato TIME hh:mm:ss,

para isso temos a função SEC_TO_TIME, então ficaria assim:

SELECT SEC_TO_TIME(AVG(TIME_TO_SEC(inicio))) AS media FROM tabela;

Como você pode ver as funções têm sempre um nome bem sugestivo, dê uma pesquisada

sobre elas, as vezes pode ser uma mão na roda!

 

Espero ter ajudado! :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue meu problema:

 

$sql_horario = "SELECT * FROM tb_usuarios";

$query_horario = mysql_query($sql_horario);

$row_horario = mysql_fetch_assoc($query_horario);

 

$entrada = $row_horario['hor_entrada'];

$saida = $row_horario['hor_saida'];

 

Existem 10 registros no banco com essas informações.

 

Quero pegar a diferença entre esses dois horários e armazenar numa variável. Contudo, vou incrementando até o resultado for = 10 (número de registros). Com isso, terei a soma de todas as diferenças. Depois pego essa soma e divido pelo número de registros. Ok?

 

O padrão das horas são datetime.

 

Quero o valor final depois da soma e divisão, uma hora neste formato: H:i

 

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Felipe,

 

Havia implementado errado o código. A primeira parte funcionou, está retornando a diferença de um registro.

 

Não entendi direito como fazer a segunda etapa: SELECT SEC_TO_TIME(AVG(TIME_TO_SEC(inicio))) AS media FROM tabela;

 

Exibi o resultado da consulta, ex.: echo row_intervalo['intervalo'];

 

Não consegui somar esses resultados e dividir pelo total de registros.

 

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda estou na primeira consulta, por isso usei este resultado.

 

SELECT TIMEDIFF(fim, inicio) AS intervalo from tabela;


Para calcular os segundos, fiz dessa maneira:

 

SELECT TIMESTAMPDIFF(SECOND, inicio, fim) AS intervalo FROM tabela;

 

Ele retorna a diferença em segundos de apenas um registro. Como faço para incrementar os resultados e dividir pelo total de registros?


Galera, fiz agora dessa maneira e quase deu certo, segue:

 

$intervalo = "SELECT TIMESTAMPDIFF(SECOND, inicio, fim) AS intervalo FROM tabela";
$query_intervalo = mysql_query($intervalo);
$total_intervalo = mysql_num_rows($query_intervalo);
while($row_intervalo = mysql_fetch_array($query_intervalo)) {
$media += $row_intervalo['intervalo'];
}
$med = $media / $total_intervalo;
$seg = gmdate("H:i", $med);
echo $seg;
Ele está retornando a média correta, porém está dando erro nesta linha:
$media += $row_intervalo['intervalo']; (Dizendo que a variável não está definida)
Alguém sabe dizer o que é?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.