Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Washington Patricio

[Resolvido] Cálculo entre Periodos

Recommended Posts

Prezados Amigos do Imasters :)

 

Estou com um enorme problema e gostaria junto com vocês desenvolver um algoritmo para uma melhor solução para o problema que descrevo abaixo.

 

Seguinte:

 

Simulamos que eu tenha um estacionamento, onde entram e saem carros durante todo o dia. Quero encontrar uma melhor maneira para calcular quantas tempo este estacionamento esteve ocupado.

 

Suponhamos que eu queira calcular entre o período de 01/01/2010 00:00 á 30/12/2010 23:59, o tempo que este estacionamento esteve ocupado, onde eu tenho todos os registros de data/hora de entrada e saida de veículos.

 

Lembrando que entre os períodos pode haver horas que o estacionamento esteve vazio.

 

Vejam este esquema:

 

esquemaf.jpg

 

Alguma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

se entendi certo, acho que bastaria apenas fazer o cálculo do tempo quando a vaga desocupa, não ?

 

Não. seria o tempo que ela esta ocupada.

De modo que eu possa ter N veiculo, não seria o calculo da VAGA e sim do ESTACIONAMENTO inteiro ... ele tendo 1 ou N carros ele está ocupado.

Quero saber quanto tempo em determinado período tinha ao menos um carro lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a lógica é a mesma...

crie as condicionais e calcule o tempo quando um carro sair.

 

por lógica, quando um veículo sai, desocupa uma vaga, certo ?

quanto mais veículos saírem mais desocupado fica o estacionamento.

 

vai chegar num ponto onde não haverá mais nenhum veículo, aí nesse momento você faz o start da data e horário em que não há nenhum veículo

quando entrar o primeiro, encerra o tempo e faz as contas..

 

mas continua confuso o motivo em querer fazer isso desse modo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a lógica é a mesma...

crie as condicionais e calcule o tempo quando um carro sair.

 

por lógica, quando um veículo sai, desocupa uma vaga, certo ?

quanto mais veículos saírem mais desocupado fica o estacionamento.

 

vai chegar num ponto onde não haverá mais nenhum veículo, aí nesse momento você faz o start da data e horário em que não há nenhum veículo

quando entrar o primeiro, encerra o tempo e faz as contas..

 

mas continua confuso o motivo em querer fazer isso desse modo.

 

É uma estatistica. O estacionamento funciona 24horas por dia. Não entendi muito bem essa sua lógica mas vou tentar raciocina por esse lado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vai desenvolver isso com banco? se for me fala que crio a logica =)

 

Bom, se for com banco você faz assim...

 

Cria uma tabela de onde vai ser registrado as entradas.

 

Nela vai ter o campo com data e horário de entrada e saída de cada carro... se o campo saída estiver NULL é que ainda tem carro estacionado.

 

Ai você, cria uma função na saida que ele analiza se tem algum carro estacionado e se nao tiver ele cria em uma outra tabela Intervalo marca o inicio do intervalo... ai quando o primeiro carro entrar ele marca o fim do intervalo.

 

Assim você tem o tempo que o estacionamento ficou vazio, e é só tirar do dia.

 

Não é a melhor forma, estou pensando em como comparar as datas ai mostro =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

então.. o que não entendi é por que não calcular por vaga ao invés do estacionamento inteiro.

 

ficaria algo mais detalhado e bastaria somar os tempos de cada vaga, tanto o tempo ocupado quanto desocupado.

 

pode extrair estatísticas de quais vagas são mais usadas, etc..

Compartilhar este post


Link para o post
Compartilhar em outros sites

então.. o que não entendi é por que não calcular por vaga ao invés do estacionamento inteiro.

 

ficaria algo mais detalhado e bastaria somar os tempos de cada vaga, tanto o tempo ocupado quanto desocupado.

 

pode extrair estatísticas de quais vagas são mais usadas, etc..

 

Sim, seria bem melhor, porem o raciocinio para calcular o intervalo que está sendo utilizado serio o mesmo, não seria só somar igual você disse porque está trabalhando com dadas e horas, tem que comparar uma por uma e agrupar os intervalos que tem mais de 1 carro, pelo que entendi, é essa agrupação que ele quer como resposta. =)

 

Quando tiver a solução posta ai... eu to sem tempo... mais quando tiver um tempinho tento fazer e postar =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faaala Galera :)

 

Bom consegui! Movimentei um pouco minha massa cinzenta e consegui uma solução!

Respondendo à alguns amigos, não é bem uma aplicação para estacionamento, só usei como exemplo. Esta rotina é na realidade para verificar uma atividade portuária. São estatísticas para um relatório que estou finalizando.

 

Vamos lá! a primeira coisa a fazer é ordenar os veículos por hora de entrada. Depois tomei o tempo do primeiro veículo como uma variável de comparação. na medida que ia verificando os outros veículos vou analizando se ele pertence ao intervalo comparado. assim posso estender o intervalo, ou pular para o próximo intervalo. Depois é só pegar o tempo de cada intervalo e somar :D

 

Fiz um código aqui para testar minha lógica e estou disponibilizando abaixo. Isso já atendeu a minha demanda, se alguém tiver uma melhoria ou uma sugestão é só falar :D

 

<?php
# Regionalização
date_default_timezone_set('America/Sao_Paulo');

# um array contendos as datas de atracação e desatracação de cada navio, ordenados por data de atracação. // Exemplo! este dados estão no DB :)
$atracacao = array(array('2011-10-09 00:00:00','2011-10-14 23:59:00'), 
	   array('2011-10-09 00:00:00','2011-10-14 23:59:00'),
	   array('2011-10-10 00:00:00','2011-10-13 23:59:00'), 
                  array('2011-10-12 00:00:00','2011-10-15 23:59:00'), 
                  array('2011-10-14 00:00:00','2011-10-16 23:59:00'), 
                  array('2011-10-17 00:00:00','2011-10-21 23:59:00'), 
                  array('2011-10-18 00:00:00','2011-10-21 23:59:00'), 
                  array('2011-10-20 00:00:00','2011-10-22 23:59:00')); 

$total = count($atracacao);
$j=0;

# percorre navio por navio.
for($i=0; $i < $total; $i++):

       # geramos um timestamp para a data de atracação e para cada desatracação
       list ($ano, $mes, $dia, $hora, $minuto, $segundo) = preg_split("/[\s-:]+/", $atracacao[$i][0]);
       $atracacao[$i][0] = mktime($hora, $minuto, $segundo, $mes, $dia, $ano);
       list ($ano, $mes, $dia, $hora, $minuto, $segundo) = preg_split("/[\s-:]+/", $atracacao[$i][1]);
       $atracacao[$i][1] = mktime($hora, $minuto, $segundo, $mes, $dia, $ano);

       # definimos a primeira data como um intervalo para comparação.
       if($i == 0):
               $periodo[0]['entrada'] = $atracacao[0][0];  
               $periodo[0]['saida']   = $atracacao[0][1];
       else:
       	# Aqui comparamos se a data de atracacao está presente no intervalo.
       	if(($atracacao[$i][0] >= $periodo[$j]['entrada']) and ($atracacao[$i][0] <= $periodo[$j]['saida'])):
		# Se a data de desatracacao for maior que a armazenada no periodo, estendemos o periodo até a data.
       		if($atracacao[$i][1] > $periodo[$j]['saida']):
       			$periodo[$j]['saida'] = $atracacao[$i][1];
       		endif;
	# Se a data não estiver presente no periodo criamos um novo periodo
        	elseif (($atracacao[$i][0] > $periodo[$j]['entrada']) and ($atracacao[$i][0] > $periodo[$j]['saida'])):
        		$j++;
        		$periodo[$j]['entrada'] = $atracacao[$i][0];
        		$periodo[$j]['saida']   = $atracacao[$i][1];
        	endif;
       endif;
endfor;


# para evento de teste, imprimo os periodos em que houve pelo menos 1 navio atracado.
$totalperiodo = count($periodo); 
$somaperiodo = 0;
for($i=0; $i < $totalperiodo; $i++):
$somaperiodo += ($periodo[$j]['saida'] - $periodo[$j]['entrada']);
endfor;
?>

 

 

Abraços turma e obrigado :)

 

@waapatricio

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.