
Calculo De DiferenÇa De Horas
#1
Posted 14/11/2009, 15:16
Como poderia resolver essa questão? Alguém pode me dar uma sugestão?
$sql = mysql_query("SELECT SEC_TO_TIME( SUM(TIME_TO_SEC( jorndif ) ) ) AS total_horas FROM ponto$comp USE INDEX (siape) where oco in('00172','55555') and siape = '$mat'");
$tdeb = mysql_result($sql,0,"total_horas");
$sq = mysql_query("SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( jorndif ) ) ) AS total_horas FROM ponto$comp USE INDEX (siape) where oco = '33333' and siape = '$mat'");
$tcre = mysql_result($sq,0,"total_horas");
$hodeb = explode(":", $tdeb);
$hocre = explode(":", $tcre);
if($tdeb > $tcre && !empty($tcre))
{
$thor = mktime ($hodeb[0] - $hocre[0], $hodeb[1] - $hocre[1], 0, 0 );
$tohor = date("H:i", $thor);
#2
Posted 15/11/2009, 00:25
O indicado é pegar primeiro a diferença das horas, isso pode ser feito direto na query. Com uma única query você pode ter o retorno das horas.
Se você explicar sua tabela, eu posso te auxiliar.

Muller Dias
ex-administrador Fórum WMO
#3
Posted 15/11/2009, 08:50
#4
Posted 15/11/2009, 13:51

Bom, você pode fazer assim:
// Essa query me retorna 3 linhas, cada linha contém a soma dos segundos de cada ocorrência do usuário $sql = mysql_query("SELECT SUM(TIME_TO_SEC(JORNDIF)) as segundos, OCO FROM sua_tabela_aqui WHERE SIAPE='".$mat."' GROUP BY OCO"); // Nas variáveis declaradas abaixo, em $tempo->positivo vai entrar os segundos da OCO 33333 e em $tempo->negativo vai entrar a soma da OCO 55555 e OCO 00172 $tempo->positivo = 0; $tempo->negativo = 0; // Faço o loop nas 3 linhas retornadas na query while ($row = mysql_fetch_object($sql)) { // se OCO é 33333, jogo os segundos em $tempo->positivo if ($row->OCO == 33333) { $tempo->positivo = $row->segundos; } // senão vou somando as outras OCO em $tempo->negativo else { $tempo->negativo += $row->segundos; } } // Verifico qual variável tem o maior valor e faço o cálculo. O resultado é em segundos. $resultado = ($tempo->positivo > $tempo->negativo) ? $tempo->positivo - $tempo->negativo : $tempo->negativo - $tempo->positivo;
Acho que está tudo certo, qualquer dúvida, poste.


Muller Dias
ex-administrador Fórum WMO
#5
Posted 15/11/2009, 20:07
Me desculpe mas ainda tenho muito a aprender.
elseif($row->OCO == 00172 || $row->OCO == 55555)
{
$tempo->negativo += $row->segundos;
}
Não era bem o que eu estava pensando que fosse...
Bom, você pode fazer assim:// Essa query me retorna 3 linhas, cada linha contém a soma dos segundos de cada ocorrência do usuário $sql = mysql_query("SELECT SUM(TIME_TO_SEC(JORNDIF)) as segundos, OCO FROM sua_tabela_aqui WHERE SIAPE='".$mat."' GROUP BY OCO"); // Nas variáveis declaradas abaixo, em $tempo->positivo vai entrar os segundos da OCO 33333 e em $tempo->negativo vai entrar a soma da OCO 55555 e OCO 00172 $tempo->positivo = 0; $tempo->negativo = 0; // Faço o loop nas 3 linhas retornadas na query while ($row = mysql_fetch_object($sql)) { // se OCO é 33333, jogo os segundos em $tempo->positivo if ($row->OCO == 33333) { $tempo->positivo = $row->segundos; } // senão vou somando as outras OCO em $tempo->negativo else { $tempo->negativo += $row->segundos; } } // Verifico qual variável tem o maior valor e faço o cálculo. O resultado é em segundos. $resultado = ($tempo->positivo > $tempo->negativo) ? $tempo->positivo - $tempo->negativo : $tempo->negativo - $tempo->positivo;
Acho que está tudo certo, qualquer dúvida, poste.
#6
Posted 15/11/2009, 22:02

O correto é else if, você colocou elseif junto.

else if ($row->OCO == 00172 || $row->OCO == 55555) { $tempo->negativo += $row->segundos; }
Mas, você nem precisa disso...

Você pode simplesmente colocar uma codição na query para pegar apenas os códigos que você quer. Faça isso:
$sql = mysql_query("SELECT SUM(TIME_TO_SEC(JORNDIF)) as segundos, OCO FROM sua_tabela_aqui WHERE SIAPE='".$mat."' AND OCO IN ('33333','00172','55555') GROUP BY OCO");
Assim não tem problema usar o else, pois na consulta não vai retornar códigos que você não precisa.


Muller Dias
ex-administrador Fórum WMO
#7
Posted 16/11/2009, 15:00
'' sem.Ponto testei e deu erro, ele soma tudo, coloquei no tabela 02:00 para o codigo 00172 e tres codigos 33333 com 08:00 cada o que daria 24 de credito contra 02 de debito o resultado está gerando 26:00 e não 24:00, o que poderia ser?Entendi, ficou bom mesmo vou testar.
#8
Posted 16/11/2009, 16:39

Dê um print_r($tempo); e posta aqui.
O campo JORNDIF é do tipo TIME né?
Você fez alguma alteração, como por exemplo converter os segundos para horas? Pois o retorno é dado em segundos, você disse que está gerando 26:00, provavelmente você fez alguma alteração aí...
Qualquer coisa eu vou te pedir para rodar umas querys direto no phpmyadmin para descobrir se está pegando os registros corretamente.

Muller Dias
ex-administrador Fórum WMO
#9
Posted 16/11/2009, 18:03
stdClass Object ( [positivo] => 0 [negativo] => 93600 )
O campo jornidf é varchar
Sim alterei acrescentei o seguinte
$resultado = $resultado/3600;
echo $resultado;
#10
Posted 16/11/2009, 18:06
Pelo visto não está entrando na condição $row->OCO == 33333...

Faça o seguinte teste:
$sql = mysql_query("SELECT SUM(TIME_TO_SEC(JORNDIF)) as segundos, OCO FROM sua_tabela_aqui WHERE SIAPE='".$mat."' AND OCO IN ('33333','00172','55555') GROUP BY OCO"); while ($row = mysql_fetch_object($sql)) { $rows[] = $row; } print_r($rows);
E também:
$sql = mysql_query("SELECT JORNDIF, OCO FROM sua_tabela_aqui WHERE SIAPE='".$mat."' AND OCO IN ('33333','00172','55555')"); while ($row = mysql_fetch_object($sql)) { $rows[] = $row; } print_r($rows);
Não se esqueça de mudar a tabela nas querys acima.

Muller Dias
ex-administrador Fórum WMO
#11
Posted 16/11/2009, 18:46
eu criei um script em php que pode te ajudar muito!
so gostaria de saber o formato que a data fica no banco de dados!
#12
Posted 16/11/2009, 20:40
Sem Ponto. Vou fazer o teste recomendado.
Sem.Ponto, primeiro teste: Tá pegando certo.
Array ( [0] => stdClass Object ( [segundos] => 7200 [oco] => 00172 ) [1] => stdClass Object ( [segundos] => 86400 [oco] => 33333 ) )
Segundo teste:
Array ( [0] => stdClass Object ( [segundos] => 7200 [oco] => 00172 ) [1] => stdClass Object ( [segundos] => 86400 [oco] => 33333 ) )
echo na $resultado
93600
descobri ele não entrava na condição $row->OCO == 33333 porque estava com zeros 0C0 e é com OCO, o resultado deu certo mesmo com varchar não cheguei nem a mudar, pois antes já dava certo dessa forma, vou testa a mudança para ver o que ocorre.
Indago mas uma questão, como o resultado está em minutos pode me ajudar na conversão para exibição em horas:minutos.
#13
Posted 16/11/2009, 23:36
$segundos = ($tempo->positivo > $tempo->negativo) ? $tempo->positivo - $tempo->negativo : $tempo->negativo - $tempo->positivo; $horas = floor($segundos / 3600); $segundos -= $horas * 3600; $minutos = floor($segundos / 60); $segundos -= $minutos * 60; echo sprintf("%02s:%02s:%02s", $horas, $minutos, $segundos);
Só porque deu certo não quer dizer que é o correto. Se você quer registrar tempo, registre num campo TIME, vai evitar problemas. O VARCHAR aceita qualquer coisa, o TIME valida antes.o resultado deu certo mesmo com varchar não cheguei nem a mudar
O seu campo VARCHAR aceita cadastrar "creme de banana", tempos inválidos como 02:88:99 e qualquer outra coisa que deixaria seu sistema louco. O TIME iria conveter qualquer dado inválido para 00:00:00, isso te dá segurança.


Muller Dias
ex-administrador Fórum WMO
#14
Posted 18/11/2009, 18:52
if($tempo->positivo != $tempo->negativo)
{
$cod = ($tempo->positivo > $tempo->negativo) ? "33333" : "00172";
}
else
{
$cod = "00000";
}
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)