Ir para conteúdo

POWERED BY:

Arquivado

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

mrbomber

Busca por intervalos de tempos

Recommended Posts

Ola.

 

Tenho no banco guardada a seguinte situacao:

 

		10:00:01	PARADO
		10:00:50	MOVIMENTO
		10:02:01	PARADO
		10:03:45	PARADO
		10:05:27	MOVIMENTO
		10:07:01	MOVIMENTO
		10:10:33	PARADO
		10:12:33	PARADO
		10:15:10	MOVIMENTO
		10:17:01	PARADO

 

Precisaria fazer uma consulta entre "10:00:01" e  "10:17:01" e mostrar os tempos de cada parada.

no caso acima deveria retornar:

 

00:00:49

00:01:44

00:02:00

 

 

Ja pesquisei aqui e nada. Alguem da um help?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Permita-me sugerir-lhe algo.

 

Porque você não inclui um campo nesta tabela, por exemplo: "Tempo"?. Neste campo você coloca o tempo em que permaneceu no seu estado (PARADO ou MOVIMENTO). Então, no momento de inserir um novo evento você faz uma subtração da hora atual pela hora do último evento do banco, e este resultado será o "tempo" que deverá ser inserido no último campo da sua tabela, antes de incluir o novo evento.

 

Veja um exemplo em JS apenas para exemplificar para você a ideia.

http://codepen.io/Eziquiel/pen/jBxbWP?editors=0100

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Eziquiel disse:

Permita-me sugerir-lhe algo.

 

Porque você não inclui um campo nesta tabela, por exemplo: "Tempo"?. Neste campo você coloca o tempo em que permaneceu no seu estado (PARADO ou MOVIMENTO). Então, no momento de inserir um novo evento você faz uma subtração da hora atual pela hora do último evento do banco, e este resultado será o "tempo" que deverá ser inserido no último campo da sua tabela, antes de incluir o novo evento.

 

Veja um exemplo em JS apenas para exemplificar para você a ideia.

http://codepen.io/Eziquiel/pen/jBxbWP?editors=0100

isso. a ideia que tenho é isso mesmo. mas queria saber se tinha uma forma de fazer isso so com mysql rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiquei pensando nesse problema, e realmente pra fazer direto via banco de dados relacional  ia precisar de algumas firulas...

 

Eu bolei um script pelo php...

<?php


try {
    
	
	$db = new PDO('mysql:host=localhost;dbname=imasters', 'root', '');	
	$stmt = $db->prepare("SELECT hora, tipo FROM hr_parada order by id ASC");		
	
	/*
	CREATE TABLE paradas(
		 id INT(8) 		PRIMARY KEY AUTO_INCREMENT
		,hr_ini			DATETIME	
		,hr_term		DATETIME	
	);
	*/
	
	$stmt->execute();
	$horas  = $stmt->fetchAll(PDO::FETCH_ASSOC);
	
	
	$ultima_acao = '';
	$hrs = array();
	foreach($horas as $row){
		
		if($ultima_acao == '' || $ultima_acao != $row['tipo']){
			$hrs[] = $row['hora'];
		}
		
		$ultima_acao = $row['tipo'];
	}
	
	$horas = array();	
	foreach($hrs as $hr){		
		$horas[] = array(
			'hora' => $hr
		);
	}
	
	
	$hrsLength = count($horas);	
	
	$x = 0;
	for($i = 0; $i < $hrsLength; $i++){
		
		$proximo = '';
		if($i != ($hrsLength - 1)){
			$nextKey = $i + 1;
			$proximo = $horas[$nextKey]['hora'];
		}
		$atual = $horas[$i]['hora'];
		
		if($x % 2 == 0 && $proximo != ''){
			$sqls[] = "INSERT INTO paradas(hr_ini, hr_term) VALUES ('{$atual}', '{$proximo}');";
		}
		$x++;
	}
	print_r($sqls);
	
	
	
	
	//var_dump($datas);
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Ele me deu de retorno isso:

Array
(
    [0] => INSERT INTO paradas(hr_ini, hr_term) VALUES ('2017-03-22 10:00:01', '2017-03-22 10:00:50');
    [1] => INSERT INTO paradas(hr_ini, hr_term) VALUES ('2017-03-22 10:02:01', '2017-03-22 10:05:27');
    [2] => INSERT INTO paradas(hr_ini, hr_term) VALUES ('2017-03-22 10:10:33', '2017-03-22 10:15:10');
)

Ai inseri os registros:

INSERT INTO paradas(hr_ini, hr_term) VALUES ('2017-03-22 10:00:01', '2017-03-22 10:00:50');
INSERT INTO paradas(hr_ini, hr_term) VALUES ('2017-03-22 10:02:01', '2017-03-22 10:05:27');
INSERT INTO paradas(hr_ini, hr_term) VALUES ('2017-03-22 10:10:33', '2017-03-22 10:15:10');

E fiz uma consulta:

SELECT 
	 hr_term
	,hr_ini  
	,SEC_TO_TIME(TIMESTAMPDIFF(SECOND, hr_ini, hr_term)) AS tempo_parada
FROM 

Que me retornou:

tempo_parada  hr_term              hr_ini               
------------  -------------------  ---------------------
00:00:49      2017-03-22 10:00:50  2017-03-22 10:00:01  
00:03:26      2017-03-22 10:05:27  2017-03-22 10:02:01  
00:04:37      2017-03-22 10:15:10  2017-03-22 10:10:33  

 

 

 

Original:
10:00:01    PARADO
10:00:50    MOVIMENTO
10:02:01    PARADO
10:03:45    PARADO
10:05:27    MOVIMENTO
10:07:01    MOVIMENTO
10:10:33    PARADO
10:12:33    PARADO
10:15:10    MOVIMENTO
10:17:01    PARADO

Basicamente no altorimo tiro as duplicidades.
E calculo a diferença de tempo.


Ficando algo +/- assim:


Duvida na integra:                                     
------------------ 
10:00:01    PARADO    (00:00:49)
10:00:50    MOVIMENTO 

10:02:01    PARADO    (00:03:26)
10:05:27    MOVIMENTO

10:10:33    PARADO    (00:04:37)
10:15:10    MOVIMENTO

10:17:01    PARADO

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por nilomf
      olá, to com uma dúvida referente a sintaxe do uso de timediff, eu sei o básico.
      Estou desenvolvendo um sistema de RH em PHP e preciso calcular a hora extra que cada funcionário trabalhou. O sistema registra o horário de entrada e saída do funcionário e também sua carga horária diária de trabalho, caso o cálculo de horário de saída - horário de entrada no mesmo dia exceder a carga horária diária, será contabilizado o excendente como hora extra, mas não faço ideia de como pegar esses dados da tabela e fazer esse cálculo.
      Tenho tentado fazer o cálculo direto no my sql com o seguinte comando:""" SELECT TIMEDIFF(horario where fluxo= 'saida', horario where fluxo = 'entrada') where data = '2015-10-10'; """
      não tem dado certo, acho que é erro na sintaxe, alguém poderia me dizer como faço esse cálculo pelo mysql ou uma outra maneira mais fácil.
       
      Obrigado!
×

Informação importante

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