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

Acumular Tempo Parado (rastreio)


reunix

Pergunta

Bom dia pessoal AJUDA por favor , há dois dias estou tentando acumular o tempo parado do veículo, através das informações que recebo do rastreador, é o seguinte...

a cada 1min recebo as informações, uma delas é se o veiculo está parado 0 = parado , 1 = em movimento, entre as outras colunas tem uma data_hora (dd/mm/yy hh:mm), a cada recebimento e SE parado , preciso ficar acumulando o tempo parado do mesmo!!

 

Certamente já pensei dessas maneiras, ao receber uma nova informação e SE parado, vou procurar na tabela de todas as informações, a último momento parado do mesmo veículo , daí subtraio a hora atual com a hora do momento anterior, exemplo , peguei a informação atual PARADO agora as 08:00, fui buscar na tabela a ultima informação PARADO, registrado anteriormente, que foi as 07:30, então entre eles tem um tempo de 30min, daí teoricamente ele ficou parado 30min. O problema é que essas informações vou solicitar a cada 1min e registrar tudo no banco, esse banco logo logo, vai crescer muito, um exemplo aqui é uma tabala do sistema antigo, tem mais de 16 milhões, imagina a cada 1min eu ter que fazer essa consulta, pegar o ultimo registro do determinado veiculo PARADO nessa tabela. Fora que ao atualiza a janela do sistema (WEB, Java , Spring), preciso fazer além desse filtro os outros..

 

 

Outra Maneira seria criar uma tabela separada, (Tempo_Parado), e registrar o momento (data_hora) , veiculo_id, daí a tabela fica um pouco menor que a do rastreio propriamente dito, então a cada 1min se o veiculo tiver parado, vou nessa tabela e procuro o momento da ultima parada dele, e vou acumulando.

 

Mas tem um problema nessas teoria.. imagina só... o cara parou as 8:00 daí fui acumulando ate as 8:30, já tenho aí 30min parado, agora o cara começou a se movimentar...

rodou uns 30min e o cara para novamente...... ou seja PAROU as 9:00,  quando eu for pegar a última hora que ele parou o sistema vai trazer 08:30, e se eu for usar a técnica acima citado por mim, o sistema vai calcular assim , ultima parada as 8:30, pardou agora as 9:00, tempo parado MAIS 30min...  espero que vocês tenham entendido......

 

Pensando um pouco agora, eu poderia quando filtrar as ultimas paradas, sempre pegar as duas 2 ultimas informações, e se a penúltima informação era EM MOVIMENTO, já sei que essa parada agora é uma parada START e não um continuação de PARADO, tipo...

 

07:30 Parado

08:00 Parado

--------30min

08:10 Movimento

08:30 Parado

 

se for pelo sistema, ele vai calcular 8:30 - 8:00 vai trazer 30min PARADO, que não é (nessa última situação ele não ficou parado 30min), na verdade ele parou agora o que pensei nesse caso foi, pegar esses 2 últimos, e caso o penúltimo seja EM MOVIMENTO, desconsiderar o calculo e somente gravar que parou, daí na próxima consulta PARADO as 8:50, o sistema vai me trazer 8:50 - 8:30 = 20min parado. 

 

Assim acredito que funcione, porém vai da trabalho e pesando no banco terá muitas consultas em tabelas grandes de volume!!!

 

Qualquer dica de vocês pode ajudar a melhorar, deve ter algo mais simples!!! 

Agradeço desde já!!!!

 

Bom dia!!!

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Primeiro sua tabela deve parecer com a primeira imagem, você poder fazer uma função que roda de tempos em tempos para apagar os registros seguindo a lógica da segunda imagem restando apenas bem menos registros, como na terceira imagem.

Agora  funções que calculam o tempo parado ou em movimento podem ser assim:

<?php
function parado () {
  // Conecta no banco
  $parados = $bd->query('SELECT * FROM `suatabela` WHERE movimento = 0');
  $tempo = 0;
  while($parado = $parados->fetch_assoc()) {
    $anterior = $bd->query('SELECT * FROM `suatabela` WHERE data < "'.$parado['data'].'" ORDER BY data desc LIMIT 1')->fetch_assoc();
    $tempo += strtotime($parado['data'])-strtotime($anterior['data']);
  }
  return $tempo;
}

function movimento () {
  // Conecta no banco
  $movimentos = $bd->query('SELECT * FROM `suatabela` WHERE movimento = 1');
  $tempo = 0;
  while($movimento = $movimentos->fetch_assoc()) {
    $anterior = $bd->query('SELECT * FROM `suatabela` WHERE data < "'.$movimento['data'].'" ORDER BY data desc LIMIT 1')->fetch_assoc();
    $tempo += strtotime($movimento['data'])-strtotime($anterior['data']);
  }
  return $tempo;
}

 

Sem título.png

Link para o comentário
Compartilhar em outros sites

  • 0
3 horas atrás, Markus Magnus disse:

Primeiro sua tabela deve parecer com a primeira imagem, você poder fazer uma função que roda de tempos em tempos para apagar os registros seguindo a lógica da segunda imagem restando apenas bem menos registros, como na terceira imagem.

Agora  funções que calculam o tempo parado ou em movimento podem ser assim:


<?php
function parado () {
  // Conecta no banco
  $parados = $bd->query('SELECT * FROM `suatabela` WHERE movimento = 0');
  $tempo = 0;
  while($parado = $parados->fetch_assoc()) {
    $anterior = $bd->query('SELECT * FROM `suatabela` WHERE data < "'.$parado['data'].'" ORDER BY data desc LIMIT 1')->fetch_assoc();
    $tempo += strtotime($parado['data'])-strtotime($anterior['data']);
  }
  return $tempo;
}

function movimento () {
  // Conecta no banco
  $movimentos = $bd->query('SELECT * FROM `suatabela` WHERE movimento = 1');
  $tempo = 0;
  while($movimento = $movimentos->fetch_assoc()) {
    $anterior = $bd->query('SELECT * FROM `suatabela` WHERE data < "'.$movimento['data'].'" ORDER BY data desc LIMIT 1')->fetch_assoc();
    $tempo += strtotime($movimento['data'])-strtotime($anterior['data']);
  }
  return $tempo;
}

 

Sem título.png

Legal Markus, vou analisar melhor com relação a performance pois preciso saber a cada solicitação, ou seja, a cada 1min, quanto tempo ele ta parado e se está parado no lugar autorizado, então fiz uma rotina simples que me diz isso, porém seguindo essa sua linha resolver o problema de ter q guardar as informações de total Parado e total Andando para relatórios mensais  !! Obg!!

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,3k
    • Posts
      652,3k
×
×
  • Criar Novo...