Ir para conteúdo
Fórum Script Brasil
  • 0

Exibir calculos de horas


Carlos Arruda

Pergunta

Pessoal vejam o codigo abaixo

esse codigo esta me retornando os valores da diferença da hora de saida e hora entrada, porem ele esta pegando somente o ultimo registro e exibindo essa informaçao precisava que ele fizesse o select de tudo e exibisse a quantidade total de horas levando em consideraçao todo o intervalo de datas.

<?php

include ("config.php");

date_default_timezone_set('UTC');

$sql="SELECT hora FROM status WHERE data Between '19/04/2010' AND '22/04/2010' AND status='Entrada' AND login='carlos.augusto' AND modulo='outsourcing'";

$res=mysql_query($sql);

while($hora=mysql_fetch_array($res)){

$horaentrada=$hora['hora'];

}

$sql2=SELECT hora FROM status WHERE data Between '19/04/2010' AND '22/04/2010' AND status='Saida Almoco' AND login='carlos.augusto' AND modulo='outsourcing'";

$res2=mysql_query($sql2);

while($hora=mysql_fetch_array($res2)){

$horasaidaalmoco=$hora['hora];

}

$sql2="SELECT hora FROM status WHERE data Between '19/04/2010' AND '22/04/2010' AND status='Retorno Almoco' AND login='carlos.augusto' AND modulo='outsourcing'";

$res2=mysql_query($sql2);

while($hora=mysql_fetch_array($res2)){

$horaretornoalmoco=$hora['hora'];

}

$sql2=SELECT hora FROM status WHERE data Between '19/04/2010' AND '22/04/2010' AND status='Saida' AND login='carlos.augusto' AND modulo='outsourcing'";

$res2=mysql_query($sql2);

while($hora=mysql_fetch_array($res2)){

$horasaida=$hora['hora];

}

$horadiff=strtotime($horasaida)-strtotime($horaentrada);

$conclui=date("H:i",$horadiff);

echo "<table align=center><tr><td bgcolor=#CCCCCC><font face=Verdana size=1>Olá! Você trabalhou </td><td bgcolor=#CCCCCC><font face=Verdana size=1>$conclui hs</td></table>";

?>

Editado por quintelab
Título alterado
Link para o comentário
Compartilhar em outros sites

25 respostass a esta questão

Posts Recomendados

  • 0

Salve,

Por parte, vamos localizar todas as informações no banco de dados

$sql    = "
            SELECT 
                hora, 
                status 
            FROM 
                status 
            WHERE 
                    DATE_FORMAT(data, '%d/%m/%Y') BETWEEN '19/04/2010' AND '22/04/2010' 
                AND 
                    status IN ('Entrada', 'Saida Almoco', 'Retorno Almoco','Saida')
                AND 
                    login='carlos.augusto' 
                AND 
                    modulo='outsourcing'
            ORDER BY
                status, hora DESC
        ";

Agora, se for mais fácil, é claro, basta montar um looping percorrendo os registros e separando em array (com indices em status) e somar a quantidade de hora

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Ursolouco,

obrigado.

Mas como fica a parte que faz o calculo da diferença entre as horas?

O meu campo que recebe a data e a hora é um campo de texto comum.

Carlos,

É interessante você usar as funções de casting (conversão de tipos) do mysql na hora da consulta e, se não me engano, há uma função de calculo de data e hora no banco de dados que dá para você fazer isso automaticamente ou.............. (há sempre um porém - John Constantine no filme CONSTANTINE) você pode fazer isso usando strtotime do php durante o looping e iir imprimindo na tela..

Sacou ?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

mas isso eu já to fazendo na query, ta exibindo valor so que quando o periodo de data é maior que um dia ele pega somente o ultimo dia da consulta e printa na tela o total dessas horas.

<?php

include ("config.php");

date_default_timezone_set('UTC');

$sql="SELECT hora FROM status WHERE data Between '19/04/2010' AND '22/04/2010' AND status='Entrada' AND login='carlos.augusto' AND modulo='outsourcing'";

$res=mysql_query($sql);

while($hora=mysql_fetch_array($res)){

$horaentrada=$hora['hora'];

}

$sql2=SELECT hora FROM status WHERE data Between '19/04/2010' AND '22/04/2010' AND status='Saida' AND login='carlos.augusto' AND modulo='outsourcing'";

$res2=mysql_query($sql2);

while($hora=mysql_fetch_array($res2)){

$horasaida=$hora['hora];

}

$horadiff=strtotime($horasaida)-strtotime($horaentrada);

$conclui=date("H:i",$horadiff);

echo "<table align=center><tr><td bgcolor=#CCCCCC><font face=Verdana size=1>Olá! Você trabalhou </td><td bgcolor=#CCCCCC><font face=Verdana size=1>$conclui hs</td></table>";

?>

Link para o comentário
Compartilhar em outros sites

  • 0

Ele está printando apenas o ultimo dia, porque ele está sempre substituindo no while, ou seja, você está guardando o valor de todos os dias na mesma variavel, logo ele só vai ficar com o ultimo valor atribuido.

O que você teria que fazer é armazenar esses valores dentro de um array, e não variavel comum.

Link para o comentário
Compartilhar em outros sites

  • 0

Alguma coisa mais ou menos assim

$sql="SELECT hora FROM status WHERE data Between '19/04/2010' AND '22/04/2010' AND status='Entrada' AND login='carlos.augusto' AND modulo='outsourcing'";
$res=mysql_query($sql);
while($hora=mysql_fetch_array($res)){
$horaentrada[]=$hora['hora'];

Assim, as horas, por exemplo de entrada, vão ficar todas armazenadas dentro da array, depois é só somar e fazer os calculos

Editado por *FIT*
Link para o comentário
Compartilhar em outros sites

  • 0

Fit, obrigado consegui.

Agora outra duvida como eu faço para calcular os minutos de atraso de um funcionario.

Ex: o horario do funcionario entrar é as 08:00 e ele registra o ponto as 08:20 isso acontece dele chegar atrasado varios dias, preciso exibir a quantidade de atraso por usuario em determinado periodo.

Link para o comentário
Compartilhar em outros sites

  • 0

Esse calculo terá que ser feito na hora que for registrada a entrada do funcionário.

Não sei como você ta fazendo essa entrada de dados, mas por exemplo: A idéia é, comparar a hora de entrada, com a hora que o funcionário realmente entrou, se a hora de entrada for menor, é porque está atrasado, sendo assim, subtraia para saber os minutos de atraso, e guarde esse valor na base de dados!

Na hora de tirar um relatório, faça o mesmo procedimento que fez para saber as horas trabalhadas, e saberá o total de atraso que o "atrasadinho" teve...rs

Vendo que sabe programar, dei apenas o raciocinio, mas qualquer coisa posta ai que ajudo no código, abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que entendi.

ficaria assim "Se o horario de entrada do sujeito é 08:00 e ele entrou 08:30 calcula a diferença e grava no banco em uma tabela que receba o nome do sujeito a quantidade de atraso e a data.

Ai para se saber o total de atraso no mes, faz se um select no banco no intervalo de data e ao final soma-se esses minutos".

Seria isso?

Link para o comentário
Compartilhar em outros sites

  • 0

Fit,

veja so o meu novo problema!

Fiz o que voce me orientou a respeito de inserir as informaçoes de atraso em uma tabela, ate ai o atraso da entrada e se o cara sair mais cedo estao funcionando legal.

já o retorno do almoco é que ta me dando dor de cabeça.

Tenho uma tabela que se chama tbl_diferenca essa tambem tem um valor que é 01:18 que é o tempo de almoço consedido a todos os funcionario, para eu calcular o atraso do almoço faço o seguinte, pego essa valor de 01:18 e gravo em uma variavel, logo em seguinda faço um select para ver a hora que o funcionario saiu para almoço, faço a soma dessa duas variaveis, faço outro select para verificar a hora que o usuario retornou.

Verifico que se o valor do retorno do almoço for maio que a soma da saida mais o intervalo concedido, calcula-se a diferença entre essas variaveis e insere a diferença no banco. So que não esta dando certo esta sendo inserido um valor que não tem nada a ver. Veja o codigo e se pode me ajudar novamente.

//seleciona quanto tempo de almoco o usuario tem

$sql_dif_almoco="SELECT diferenca FROM dif_almoco";

$res_dif_almoco=mysql_query($sql_dif_almoco);

while($res_dif_almoco1=mysql_fetch_array($res_dif_almoco)){

$dif_almoco=$res_dif_almoco1['diferenca'];

}

//grava a diferença em uma variavel

$dif_almoco1=date("H:i",$dif_almoco);

//verifica se o status é retorno do almoco, se for faz um select para saber a hora que o usuario saiu para almocar e grava numa variavel

if($_status==Retorno Almoco'){

$select_sa_status="SELECT hora FROM status WHERE nome='$nome_usr' AND login='$login_usr' AND modulo='$modulo_usr' AND data='$data' AND status='Saida Almoco'";

$res_select_sa=mysql_query($select_sa_status);

while($res_select_sa1=mysql_fetch_array($res_select_sa)){

$status_sa=$res_select_sa1['hora];

}

//pega a hora que o usuario saiu para o almoco e soma com a diferença

$horadiff=strtotime($status_sa)+strtotime($dif_almoco1);

$concluira=date("H:i",$horadiff);

//seleciona hora que o usuario voltou do almoco

$select_ra_status="SELECT hora FROM status WHERE nome='$nome_usr' AND login='$login_usr' AND modulo='$modulo_usr' AND data='$data' AND status='Retorno Almoco'";

Link para o comentário
Compartilhar em outros sites

  • 0
Fit,

veja so o meu novo problema!

Fiz o que voce me orientou a respeito de inserir as informaçoes de atraso em uma tabela, ate ai o atraso da entrada e se o cara sair mais cedo estao funcionando legal.

já o retorno do almoco é que ta me dando dor de cabeça.

Tenho uma tabela que se chama tbl_diferenca essa tambem tem um valor que é 01:18 que é o tempo de almoço consedido a todos os funcionario, para eu calcular o atraso do almoço faço o seguinte, pego essa valor de 01:18 e gravo em uma variavel, logo em seguinda faço um select para ver a hora que o funcionario saiu para almoço, faço a soma dessa duas variaveis, faço outro select para verificar a hora que o usuario retornou.

Verifico que se o valor do retorno do almoço for maio que a soma da saida mais o intervalo concedido, calcula-se a diferença entre essas variaveis e insere a diferença no banco. So que não esta dando certo esta sendo inserido um valor que não tem nada a ver. Veja o codigo e se pode me ajudar novamente.

//seleciona quanto tempo de almoco o usuario tem

$sql_dif_almoco="SELECT diferenca FROM dif_almoco";

$res_dif_almoco=mysql_query($sql_dif_almoco);

while($res_dif_almoco1=mysql_fetch_array($res_dif_almoco)){

$dif_almoco=$res_dif_almoco1['diferenca'];

}

//grava a diferença em uma variavel

$dif_almoco1=date("H:i",$dif_almoco);

//verifica se o status é retorno do almoco, se for faz um select para saber a hora que o usuario saiu para almocar e grava numa variavel

if($_status==Retorno Almoco'){

$select_sa_status="SELECT hora FROM status WHERE nome='$nome_usr' AND login='$login_usr' AND modulo='$modulo_usr' AND data='$data' AND status='Saida Almoco'";

$res_select_sa=mysql_query($select_sa_status);

while($res_select_sa1=mysql_fetch_array($res_select_sa)){

$status_sa=$res_select_sa1['hora];

}

//pega a hora que o usuario saiu para o almoco e soma com a diferença

$horadiff=strtotime($status_sa)+strtotime($dif_almoco1);

$concluira=date("H:i",$horadiff);

//seleciona hora que o usuario voltou do almoco

$select_ra_status="SELECT hora FROM status WHERE nome='$nome_usr' AND login='$login_usr' AND modulo='$modulo_usr' AND data='$data' AND status='Retorno Almoco'";

dê um echo para ver se a conversão das horas está ok,

date("h:i",$horadiff); talvez o erro esteja na conversão

Link para o comentário
Compartilhar em outros sites

  • 0

Opa rickayron!

O problema que o erro ta nessa soma ai mesmo, porem eu utilizo esse mesmo comando fazendo uma subtraçao da hora que o funcionario entrou com a hora que deveria entrar e da certinho, agora essa soma que ta me quebrando as pernas.

Alguma dica do que devo fazer?

Link para o comentário
Compartilhar em outros sites

  • 0

Fit, ele retornar um numero muito alem do esperado.

Tipo que se era para apresentar 00:10 minutos de atraso ele vem com um valor de 06:45 hs.

Vale lembrar tambem que o campo que recebe esse valor no banco é um campo varchar.

Fit, não sei como fazer separadamente.

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, vamos lá, sabe usar a função explode e implode?

Exemplo:

$horaInicial = "12:10";
$horaFinal = "12:28";

$horaInicial = explode(":", $horaInicial);
$horaFinal = explode(":", $horaFinal);

$difHora = $horaFinal[0] - $horaInicial[0];
$difMinutos = $horaFinal[1] - $horaInicial[1];

if($difMinutos < 0){$difMinutos = $difMinutos + 60; $difHora = $difHora - 1;}
$hora = array($difHora, $difMinutos);
$difHoraFinal = implode(":", $hora);
echo $difHoraFinal;

Ps: Alterei um pedaço do código, desculpe, pois me enganei, mas agora ta redondo!

O ruim disso é que da um volta legal, mas testa ai, se funcionar ou não, posta ai pra gente saber, afinal ainda não testei o código!

Editado por *FIT*
Link para o comentário
Compartilhar em outros sites

  • 0

Fit,

agora deu certo o problema tava na minha logica para efetuar o calculo.

Agora eu faço assim, pego o horario que ele saiu para almoco, e o horario que retornou e gravo em uma variavel, faço uma diferença entre as duas para ver o valor em tempo, pego essa diferença e comparo com o valor exato que é de 01:18 que todo funiconario tem direito ao almoco, se a diferença entre as horas for maior que esse valor faço uma subtraçao entre ela e gravo o resultado no banco. Pronto para inserir os valores agora ta bacana.

Agora preciso arrumar uma forma de já somar esses valores dentro do proprio select, porem quando eu faço isso ele ignora tudo que ta depois dos (:) dois ponto, faz a soma somente do primeiro campo.

Agora é quebrar mais um pouco a cabeça.

if($_status=='Retorno Almoco'){

$sql_dif="SELECT * FROM dif_almoco";

$res_dif=mysql_query($sql_dif);

while($res_dif_almoco=mysql_fetch_array($res_dif)){

$dif_almoco=$res_dif_almoco['diferenca'];

}

//verifica a hora que o usuario saiu para almocar

$sql_salmoco=SELECT hora FROM status WHERE nome='$nome_usr' AND login='$login_usr' AND modulo='$modulo_usr' AND data='$data' AND status='Saida Almoco'";

$res_salmoco=mysql_query($sql_salmoco);

while($res_sql_salmoco=mysql_fetch_array($res_salmoco)){

$salmoco=$res_sql_salmoco['hora];

}

//verifica a hora que ele voltou

$sql_ralmoco="SELECT hora FROM status WHERE nome='$nome_usr' AND login='$login_usr' AND modulo='$modulo_usr' AND data='$data' AND status='Retorno Almoco'";

$res_ralmoco=mysql_query($sql_ralmoco);

while($res_sql_ralmoco=mysql_fetch_array($res_ralmoco)){

$ralmoco=$res_sql_ralmoco['hora'];

}

//calcula a diferenca entra o retorno e a saida do almoco

$dif_rs_almoco=strtotime($ralmoco)-strtotime($salmoco);

$total_dif_rs_almoco=date("H:i",$dif_rs_almoco);

//verifica se já existe algum valor para esse metodo

$ver_status_ra=mysql_query("SELECT * FROM tbl_atraso WHERE login='$login_usr' AND data='$data' AND status='Retorno Almoco'");

if(mysql_num_rows($ver_status_ra) >0){

$ra_status=1;

}

//verifica se a diferença entre o retorno e a saida do almoco é maior do que o intervalo concedido pela empresa, se for calcula novamente a diferença entre esses valores e insere no banco.

if(($total_dif_rs_almoco > $dif_almoco) && ($ra_status!=1)){

$diferenca_almoco=strtotime($total_dif_rs_almoco)-strtotime($dif_almoco);

$finaliza=date("H:i",$diferenca_almoco);

$insere_atraso_ra="INSERT INTO tbl_atraso (login,tempo,data,status,modulo) VALUES ('$login_usr','$finaliza','$data','Retorno Almoco','$modulo_usr')";

$insere_ra=mysql_query($insere_atraso_ra);

}

}

Link para o comentário
Compartilhar em outros sites

  • 0
Fit,

agora deu certo o problema tava na minha logica para efetuar o calculo.

Agora eu faço assim, pego o horario que ele saiu para almoco, e o horario que retornou e gravo em uma variavel, faço uma diferença entre as duas para ver o valor em tempo, pego essa diferença e comparo com o valor exato que é de 01:18 que todo funiconario tem direito ao almoco, se a diferença entre as horas for maior que esse valor faço uma subtraçao entre ela e gravo o resultado no banco. Pronto para inserir os valores agora ta bacana.

Agora preciso arrumar uma forma de já somar esses valores dentro do proprio select, porem quando eu faço isso ele ignora tudo que ta depois dos ( :) dois ponto, faz a soma somente do primeiro campo.

Agora é quebrar mais um pouco a cabeça.

if($_status=='Retorno Almoco'){

$sql_dif="SELECT * FROM dif_almoco";

$res_dif=mysql_query($sql_dif);

while($res_dif_almoco=mysql_fetch_array($res_dif)){

$dif_almoco=$res_dif_almoco['diferenca'];

}

//verifica a hora que o usuario saiu para almocar

$sql_salmoco=SELECT hora FROM status WHERE nome='$nome_usr' AND login='$login_usr' AND modulo='$modulo_usr' AND data='$data' AND status='Saida Almoco'";

$res_salmoco=mysql_query($sql_salmoco);

while($res_sql_salmoco=mysql_fetch_array($res_salmoco)){

$salmoco=$res_sql_salmoco['hora];

}

//verifica a hora que ele voltou

$sql_ralmoco="SELECT hora FROM status WHERE nome='$nome_usr' AND login='$login_usr' AND modulo='$modulo_usr' AND data='$data' AND status='Retorno Almoco'";

$res_ralmoco=mysql_query($sql_ralmoco);

while($res_sql_ralmoco=mysql_fetch_array($res_ralmoco)){

$ralmoco=$res_sql_ralmoco['hora'];

}

//calcula a diferenca entra o retorno e a saida do almoco

$dif_rs_almoco=strtotime($ralmoco)-strtotime($salmoco);

$total_dif_rs_almoco=date("H:i",$dif_rs_almoco);

//verifica se já existe algum valor para esse metodo

$ver_status_ra=mysql_query("SELECT * FROM tbl_atraso WHERE login='$login_usr' AND data='$data' AND status='Retorno Almoco'");

if(mysql_num_rows($ver_status_ra) >0){

$ra_status=1;

}

//verifica se a diferença entre o retorno e a saida do almoco é maior do que o intervalo concedido pela empresa, se for calcula novamente a diferença entre esses valores e insere no banco.

if(($total_dif_rs_almoco > $dif_almoco) && ($ra_status!=1)){

$diferenca_almoco=strtotime($total_dif_rs_almoco)-strtotime($dif_almoco);

$finaliza=date("H:i",$diferenca_almoco);

$insere_atraso_ra="INSERT INTO tbl_atraso (login,tempo,data,status,modulo) VALUES ('$login_usr','$finaliza','$data','Retorno Almoco','$modulo_usr')";

$insere_ra=mysql_query($insere_atraso_ra);

}

}

você precisa fazer dois selects

pois assim nunca vai funcionar select sum(valor) as horas, nome, data from tabela

talvez com union funcione as eu nunca conseguir retornar soma e select até mais

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...