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

Como selecionar hora mais proxima


Sorokabano

Pergunta

Pessoal , estou com a seguinte duvida.

Tenho 2 tabelas (AGENDA) onde tem os campos cod_veiculo e data/hora_prevista e a tabela (MARCAÇÃO) onde tem os campos cod_veiculo e data/hora marcada.

O que eu preciso, na tabela agenda tem a identificação do veiculo e a hora que é pra ele passar em determinado ponto. E na tabela marcação tem a identificação do veiculo e a hora que ele passou por esse ponto.

Porem como o veiculo vai passar varias vezes ao dia pelo mesmo ponto preciso saber como ligar o horario que ele passou com o horario que estava previsto, para poder calcular o atraso ou adiantamento do mesmo. EX:

(AGENDA)

0001 12/12/2009-12:35

0001 12/12/2009-12:55

0001 12/12/2009-13:40

(MARCAÇÃO)

0001 12/12/2009-12:40

Vendo isso, pegarei a marcação e verei qual data/hora esta mais proxima na tabela AGENDA (tanto pra mais quanto pra menos) que no caso é a de 12/12/2009-12:35

Vou pegar a hora(marcação) subutrair hora(agenda) e retornar o tempo que o carro esta atarasado ou adiantado, que no caso é 5 min atrasado

Então , minha duvida é, como selecionar a hora mais proxima.

Obrigado

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Oi Sorokabano

Vou passar uma idéia veja se é possível usa-la.

Nesta situação seria bom que você tivesse a data no formato '2009-11-24 12:00:00' = Ano-Mes-Dia Hora:Minuto:Segundo

Então a comparação seria feita em segundos usando a função TIMESTAMPDIFF

Exemplo:

select TIMESTAMPDIFF( second, dataagenda , datamarcacao )

from pedido

order by TIMESTAMPDIFF( second, dataagenda , datamarcacao ) limit 1;

O Resultado seria o menor tempo comparado com a dataagenda devido ao order by

se fosse necessário o maior tempo poderia usar oder by TIMESTAMPDIFF( second, dataagenda , datamarcacao ) desc limit 1;

Exemplos:

=======

select TIMESTAMPDIFF( second, '2009-01-24 00:00:00' , ' 2009-11-24 00:00:00' )

from sua_tabela;

o Resultado seria 26265600 (que dividido por 3600) = 7296 minutos / 24 horas = 304 dias

Seguindo o seu raciocínio e o seu exemplo:

(MARCAÇÃO)

0001 12/12/2009-12:40

Vendo isso, pegarei a marcação e verei qual data/hora esta mais proxima na tabela AGENDA (tanto pra mais quanto pra menos) que no caso é a de 12/12/2009-12:35

select TIMESTAMPDIFF( second, '2009-12-12 12:35:00' , ' 2009-12-12 12:40:00' )

from sua_tabela ;

o resultado seria 300 - Transformando em minutos 300/60 = 5,00

Pode fazer o cáculo direto se desejar a resposta em minutos.

select round(TIMESTAMPDIFF( second, '2009-12-12 12:35:00' , ' 2009-12-12 12:40:00' )/60,2)

from sua_tabela ;

resultado=5.00

ou trocando a opção second por minute

select TIMESTAMPDIFF( minute, '2009-12-12 12:35:00' , ' 2009-12-12 12:40:00' )

from sua_tabela;

Resultado = 5

As datas só estão ai para tornar fácil a explicação, você usará o seus campos: dataagenda , datamarcacao.

Obs.: a função TIMESTAMPDIFF parece que foi incluída na versão 5.00 do MySql, mas creio que vale a idéia. Você pode chegar a este resultado usando as funções antigas de cálculo entre data e hora. O que queria deixar claro é a lógica que ao meu ver esta sua operação deveria ser transformado em segundos para que você ordene pelo menor tempo em segundos e selecione o menor.

Só que eu fiquei com uma dúvida quanto a sua lógica pelo seguinte. Você deu um exemplo de atraso de 5 minutos, mas supondo que ocorra um grande atraso e o horário da marcação fosse 12:56?

Seguindo o teu exemplo o menor tempo seria em relação ao horário 12:55 logo um minuto atrasado. Porém o cara está 21 minutos atrasado em relação ao horário 12:35 e no meu ver penso que o horário que importaria seria o 12:35

(a) 0001 12/12/2009-12:35

(B) 0001 12/12/2009-12:55 Horário de uma suposta marcação 12:56

diferença 1 minuto em relaçao ao item (a) e 21 minutos em atraso em relaçao ao item (B)

Talvez a melhor maneira seja criar um campo aonde você adicione o horário da marcação exemplo:

=================================

Horário previsto(agenda) | horário marcacao |

=================================

2009-12-12-12:30:00 | 2009-12-12 12:35:00 | 5 atrasado

2009-12-12 12:35:00 | 2009-12-12 12:56:00 | 21 atrasado

2009-12-12 12:55:00 | |

2009-12-12 13:00:00 | |

=================================

Assim você iria gravando o horário que o cara passou além de ficar registrado.

Se caso não foi isto, desconsidere a resposta porque ai eu entendi errado.

Um abraço!

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,4k
×
×
  • Criar Novo...