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

Timediff


Carlos Arruda

Pergunta

Bom dia!

Preciso de um auxilio de como utilizar o timediff para trabalhar juntamente com um select.

Preciso fazer o select de dois campos de uma tabela levando em consideraçao alguns criterios e depois utilizar o timediff com o resultadado desse select.

alguém saberia me ajudar?

obrigado.

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Segue abaixo o que diz o manual sobre esta função.

DATEDIFF(expr,expr2), TIMEDIFF(expr,expr2)

DATEDIFF() retorna o número de dias entre a data inicial expr e a data final expr2. expr e

expr2 são expressões de datas ou data e hora. Apenas a parte da data dos valores sã usados no

cálculo.

TIMEDIFF() retorna o tempo entre a hora inicial expr e a hora final expr2. expr e expr2

são expressões de hora ou data e hora, mas ambas devem ser do mesmo tipo.

mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
-> 1
mysql> SELECT DATEDIFF('1997-11-31 23:59:59','1997-12-31');
-> -30
mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');
-> '-00:00:00.000001'
mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001','1997-12-30 01:01:01.000002');
-> '46:58:57.999999'

Exponha melhor o que você precisa para que possamos te ajudar.

Link para o comentário
Compartilhar em outros sites

  • 0

Ok Denis, Obrigado!

Dessa forma funciona sim, mas eu preciso que seja feita o calculo da diferença entre dois ou mais campos de uma tabela.

Ex:

Tenho uma tabela que recebe a hora de acordo com os status horaentrada, horasaidaalmoco, retornoalmoco e saida preciso fazer um select para retornar esses valores e efetuar a subtraçao entre eles.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'Carlos Arruda'!

Se os seus campos de hora citados acima estão no formato definido para uso com a função timediff, então declare como abaixo:

SELECT horasaidaalmoco, retornoalmoco, timediff(retornoalmoco, horasaidaalmoco) as tempo_de_almoco
FROM minhatabela;
Saida
12:00:00    13:00:00    01:00:00
12:01:00    13:00:00    00:59:00
12:01:01    13:00:00    00:58:59
11:45:43    13:05:05    01:19:22

Link para o comentário
Compartilhar em outros sites

  • 0

Entendi!

Mas acredito que minha estrutura de tabela esteja errada, pois o campo hora recebe tanto a hora de entrada como a de saidaalmoco, retornoalmoco e saida, o que muda é somente o status.

teria que juntar dois select tipo:

SELECT hora FROM status WHERE status='entrada'

SELECT hora FROM status WHERE status='saidaalmoco'

existe uma forma mais simplificada?

Link para o comentário
Compartilhar em outros sites

  • 0
...

existe uma forma mais simplificada?

Mais simplificada, não. Fica um pouco mais complicada.

select entrada, saidaalmoco, timediff(saidaalmoco, entrada) as tempotrabalhado
from
(select a1.data, a1.matriculafuncional, a1.hora as entrada from status a1 where status ='entrada') t1
INNER JOIN 
(select a2.data, a2.matriculafuncional, a2.hora as saidaalmoco from status a2 where status ='saidaalmoco') t2
ON t1.data=t2.data and a1.matriculafuncional = a2.matriculafuncional

Usei a data e a matriculafuncional para estabelecer uma unicidade entre o funcionário e a data do evento.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom,

Todos essas informaçoes são inseridas na Tabela Status, em cada linha ela recbe um evento.

Tentei fazer igual ao seu codigo

select entrada, saidaalmoco, timediff(saidaalmoco, entrada) as tempotrabalhado
from
(select a1.data, a1.nome, a1.hora as entrada from status a1 where data='19/04/2010' and status ='entrada') t1
INNER JOIN 
(select a2.data, a2.nome, a2.hora as saidaalmoco from status a2 where data='19/04/2010 ' and status ='saidaalmoco') t2
ON t1.data=t2.data and a1.nome = a2.nome

Esta dando erro na nomeaçao dos campos da tabela se eu faço somente o select separados sem as informaçoes de a2.data e coloco somente os campos normais a consulta funciona.

Editado por Denis Courcy
Melhoria no entendimento do código
Link para o comentário
Compartilhar em outros sites

  • 0

Denis,

utilizando da forma abaixo ele da a mensagem de sucesso porem não retorna nada.

Seu comando SQL foi executado com sucesso ( Consulta levou 0.0010 segundos )

SELECT entrada, saidaalmoco, timediff( saidaalmoco, entrada ) AS tempotrabalhado
FROM 
(SELECT DATA , nome, hora AS entrada
FROM STATUS a1
WHERE STATUS = 'entrada') t1
INNER JOIN 
(SELECT DATA , nome, hora AS saidaalmoco
FROM STATUS a2
WHERE STATUS = 'saidaalmoco') t2 
ON t1.data = t2.data AND t1.nome = t1.nome

Editado por Denis Courcy
Melhoria no entendimento do código
Link para o comentário
Compartilhar em outros sites

  • 0
Denis,

utilizando da forma abaixo ele da a mensagem de sucesso porem não retorna nada.

Seu comando SQL foi executado com sucesso ( Consulta levou 0.0010 segundos )

Você não seguiu corretamente o código que passei. É importante que os atributos sejam precedidos de a1 ou a2 (que é a tabela renomeada logicamente para esta insrução, pois estamos tratando da mesma tabela com tres instruções selects aninhadas.)

Verifique se o código está executando e retornando separadamente.

Faça os testes abaixo e verifique o retorno.

Teste1

SELECT a1.DATA , a1.nome, a1.hora AS entrada
FROM STATUS a1
WHERE STATUS = 'entrada' AND a1.data = '2010-04-01' AND a1.nome = 'JOAO';
Teste2
SELECT a2.DATA , a2.nome, a2.hora AS saidaalmoco
FROM STATUS a2
WHERE STATUS = 'saidaalmoco' AND a2.data = '2010-04-01' AND a2.nome = 'JOAO';
O nome JOAO e a data '2010-04-01 foram usados somente como exemplo. Substitua por um nome e uma data apropriados Se tudo der certo, junteos na instrução abaixo:
SELECT entrada, saidaalmoco, timediff( saidaalmoco, entrada ) AS tempotrabalhado
FROM 
   (SELECT a1.DATA , a1.nome, a1.hora AS entrada
    FROM STATUS a1
    WHERE STATUS = 'entrada') t1
INNER JOIN 
   (SELECT a2.DATA , a2.nome, a2.hora AS saidaalmoco
    FROM STATUS a2
    WHERE STATUS = 'saidaalmoco') t2 
ON t1.data = t2.data AND t1.nome = t1.nome

Link para o comentário
Compartilhar em outros sites

  • 0

Denis,

Estou quase conseguindo. Veja como ta ficando meu codigo.

Da forma que voce esta passando não esta me retornando nada na tela

meu exemplo.

So que agora to apanhando para fazer com que ele calcule os valores do perido de datas diferentes, pois agora ele so respeita a ultima informaçao encontrada.

<?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>";

?>

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...