Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×