Ir ao conteúdo
  • Cadastre-se
fabio.argenton

MySQL RESOLVIDO:MySQL: SELECT para pegar o menor tempo entre registros da mesma tabela

Recommended Posts

Boa noite,
Preciso gerar uma consulta SQL que traga o melhor tempo entre registros de uma única tabela, exemplo:

 

Minha tabela:

CREATE TABLE `mesaproducao` (
    	`id` INT(11) NOT NULL AUTO_INCREMENT,
    	`codProducao` INT(11) NOT NULL,
    	`mesaProducao` VARCHAR(50) NOT NULL,
    	`pn` VARCHAR(50) NOT NULL,
    	`descricao` VARCHAR(50) NOT NULL,
    	`multiplo` INT(11) NOT NULL,
    	`tipo` VARCHAR(50) NOT NULL,
    	`lote` VARCHAR(50) NOT NULL,
    	`bip` VARCHAR(50) NOT NULL,
    	PRIMARY KEY (`id`)
    )

 

Abaixo explicado e destacado de verde o que quero trazer com este SELECT:

 

image.thumb.png.c07982d44c5dc95f1ebbe7a6054af797.png

Editado por fabio.argenton

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá para chegar a esse resultado com as seguintes consultas.

/*Retorna a diferença em segundos, você deve tratar a formação na sua aplicação*/
SELECT
  mp_atual.pn,
  mp_atual.descricao,
  MIN(UNIX_TIMESTAMP(STR_TO_DATE(mp_atual.bip, '%d/%m/%Y %H:%i:%s')) - UNIX_TIMESTAMP(STR_TO_DATE(mp_anterior.bip, '%d/%m/%Y %H:%i:%s'))) as diff
FROM
  `mesaproducao` AS mp_atual
LEFT JOIN
  mesaproducao AS mp_anterior
ON
  mp_anterior.id < mp_atual.id
GROUP BY
  mp_atual.pn,
  mp_atual.descricao

/*Ou, retorna a diferença como TIME porém falha se existir alguma diferença superior a 24 horas(embora na documentação o valor maximo seja 838:59:59 https://dev.mysql.com/doc/refman/5.7/en/time.html) no resultado final ou inferior a 0 segundos(acontece caso algum registro posterior tenha a data inferior)(embora a documentação informe o valor minimo seja -838:59:59 https://dev.mysql.com/doc/refman/5.7/en/time.html)*/
SELECT
  mp_atual.pn,
  mp_atual.descricao,
  SEC_TO_TIME(MIN(UNIX_TIMESTAMP(STR_TO_DATE(mp_atual.bip, '%d/%m/%Y %H:%i:%s')) - UNIX_TIMESTAMP(STR_TO_DATE(mp_anterior.bip, '%d/%m/%Y %H:%i:%s')))) as diff
FROM
  `mesaproducao` AS mp_atual
LEFT JOIN
  mesaproducao AS mp_anterior
ON
  mp_anterior.id < mp_atual.id
GROUP BY
  mp_atual.pn,
  mp_atual.descricao

/*Ou, porém falha se for calculada alguma diferença maior que 24 horas(embora na documentação o valor maximo seja 838:59:59 https://dev.mysql.com/doc/refman/5.7/en/time.html) mesmo que ela não vá aparecer no resultado final ou inferior a 0 segundos(acontece caso algum registro posterior tenha a data inferior)(embora a documentação informe o valor minimo seja -838:59:59 https://dev.mysql.com/doc/refman/5.7/en/time.html).*/
SELECT
  mp_atual.pn,
  mp_atual.descricao,
  MIN(TIMEDIFF(STR_TO_DATE(mp_atual.bip, '%d/%m/%Y %H:%i:%s'), STR_TO_DATE(mp_anterior.bip, '%d/%m/%Y %H:%i:%s'))) as diff
FROM
  `mesaproducao` AS mp_atual
LEFT JOIN
  mesaproducao AS mp_anterior
ON
  mp_anterior.id < mp_atual.id
GROUP BY
  mp_atual.pn,
  mp_atual.descricao

Pode ser testado em http://sqlfiddle.com/#!9/20b18b.

Editado por HwapX

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda pessoal, HwapX você é fera, fiquei com a terceira opção porém modifiquei um pouco...segue solução, desta forma exporto para Excel e faço um pouco diferente, vou calcular a média e não o menor tempo, assim terei o resultado esperado:

 

/*Retorna a diferença em segundos, de um Bip para Outro*/
SELECT 
reg_atual.pn, 
reg_atual.descricao, 
reg_anterior.bip AS bipInicial, 
reg_atual.bip AS bipFinal,
TIMEDIFF(STR_TO_DATE(reg_atual.bip, '%d/%m/%Y %H:%i:%s'), STR_TO_DATE(reg_anterior.bip, '%d/%m/%Y %H:%i:%s')) as tempo

FROM
mesaproducao AS reg_atual

LEFT JOIN
mesaproducao AS reg_anterior

ON reg_anterior.id < reg_atual.id
GROUP BY reg_anterior.id

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×