none
Selecionar primeiro e ultimo registro entre datas - SQLServer 2012 RRS feed

  • Pergunta

  • Bom dia a todos.

    Tenho uma tabela com os dados analógicos de um Poço Tubular Profundo (PTP001_Ana) que contém colunas TimeStamp, vazao, pressao, hora_horimetro, minuto_horimetro. Onde a PK é TimeStamp.

    Essas colunas *_horimetro são pra medir o tempo de funcionamento do poço, onde a cada 60 minuto_horimetro soma "+1" na hora_horimetro.

    Preciso contar o tempo de funcionamento do poço num determinado período. Pra isso, precisaria selecionar o último registro de hora e minuto e subtrair com o primeiro registro.

    Desde já, agradeço.


    PAULO RICARDO CENTRO DE CONTROLE OPERACIONAL - CCO

    • Editado RicardoRSV terça-feira, 28 de junho de 2016 12:26
    terça-feira, 28 de junho de 2016 12:22

Respostas

  • Boa tarde,

    Experimente fazer uns testes mais ou menos dessa forma:

    with
        CTE_Pri as
        (
            select top(1) 
                hora_horimetro, 
                minuto_horimetro
            from PTP001_Ana
            where 
                TimeStamp between @DataIni and @DataFim
            order by 
                TimeStamp
        ),
    
        CTE_Ult as
        (
            select top(1) 
                hora_horimetro, 
                minuto_horimetro
            from PTP001_Ana
            where 
                TimeStamp between @DataIni and @DataFim
            order by 
                TimeStamp desc
        ),
    
        CTE_Dif as
        (
            select 
                p.hora_horimetro as pri_hora_horimetro,
                p.minuto_horimetro as pri_minuto_horimetro,
                u.hora_horimetro as ult_hora_horimetro,
                u.minuto_horimetro as ult_minuto_horimetro,
                (u.hora_horimetro * 60 + u.minuto_horimetro) -
                (p.hora_horimetro * 60 + p.minuto_horimetro) as dif_minutos
            from CTE_Pri as p
            cross join CTE_Ult as u
        )
    
    select
        *,
        cast(dif_minutos / 60 as varchar(5)) + ':' +
        Right('0' + cast(dif_minutos % 60 as varchar(2)), 2) as Diferenca
    from CTE_Dif

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta RicardoRSV terça-feira, 28 de junho de 2016 20:20
    terça-feira, 28 de junho de 2016 19:51

Todas as Respostas

  • Bom dia Ricardo,

    Se eu entendi bem ficaria mais ou menos assim:

    SELECT MAX(hora_horimetro) - MIN(hora_horimetro) DIF_HOUR,MAX(minuto_horimetro) - MIN(minuto_horimetro) DIF_MIN FROM PTP001_Ana WHERE TIMESTAMP BETWEEN DATA1 AND DATA2 

    Teste ae e veja se funciona.

    Att

    Reginaldo C. Silva

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 28 de junho de 2016 14:14
    • Marcado como Resposta Thales F Quintas terça-feira, 28 de junho de 2016 18:29
    • Não Marcado como Resposta RicardoRSV terça-feira, 28 de junho de 2016 20:26
    terça-feira, 28 de junho de 2016 13:01
  • Reginaldo, obrigado pela ajuda.

    Com essa query, está retornando o máximo - mínimo tanto de minutos, quanto de horas. Como o sistema grava a cada 5 minutos, retornou: "55 - 00 = 55" para minutos e "9 - 0 = 9" para horas, o resultado foi 9h:55min devendo ser 9h:00min.

    Setei a data inicial como teste para '00:00' e final '09:00'


    PAULO RICARDO CENTRO DE CONTROLE OPERACIONAL - CCO

    • Editado RicardoRSV terça-feira, 28 de junho de 2016 14:19
    terça-feira, 28 de junho de 2016 14:19
  • Entendi,

    Realmente os minutos tem que fazer uma validação a mais, testa esse exemplo:

    SELECT CASE WHEN TAB.DIF > 60 THEN TAB.DIF / 60 END HORAS,
    CASE WHEN TAB.DIF % 60 > 0 THEN TAB.DIF % 60 END MINUTOS
    FROM 
    (
    SELECT ((MAX(hora_horimetro) * 60) + (SELECT MAX(M.minuto_horimetro) FROM PTP001_Ana M WHERE M.hora_horimetro = MAX(A.hora_horimetro))) - 
    ((MIN(hora_horimetro) * 60) + (SELECT MIN(M2.minuto_horimetro) FROM PTP001_Ana M2 WHERE  M2.hora_horimetro = MIN(A.hora_horimetro)))  DIF
    FROM PTP001_Ana A WHERE TIMESTAMP BETWEEN DATA1 AND DATA2 
    )TAB

    Ele pega a quantidade de horas e transforma em minutos + minutos e subtrai os dois, exemplo:

    Maior hora: 13:15 = 795 minutos

    Menor Hora: 8:45 = 525 minutos

    Substração: 795 - 525 = 270 minutos

    select 270 / 60 = 4 horas

    select 270 % 60= 30 minutos

    4 horas e 30 minutos.

    Espero ter sido claro,

    Att

    terça-feira, 28 de junho de 2016 14:40
  • Reginaldo, continua com o mesmo retorno: 09 para Hora e 55 para Minuto

    Acho que o erro está em pegar a hora/minuto MAX e diminuir com o MIN.

    Pela lógica, deveria ser o último registro e não o máximo.

    Obrigado


    PAULO RICARDO CENTRO DE CONTROLE OPERACIONAL - CCO

    • Editado RicardoRSV terça-feira, 28 de junho de 2016 15:27
    terça-feira, 28 de junho de 2016 15:27
  • Estranho, aqui funcionou, pois a lógica é essa mesmo.

    Voce vai pegar a maior hora e o maior minuto daquela hora.

    Depois pegar a menor hora e pegar o menor minuto dentro daquela hora.

    Transforma tudo em minuto e fazer o calculo...

    Simulei com uma tabela aqui funcionou.

    terça-feira, 28 de junho de 2016 16:03
  • Este foi o resultado:
    Acima, o da Query que você exemplificou;
    Abaixo, o primeiro e último resultado bruto (Pra comparação)


    PAULO RICARDO CENTRO DE CONTROLE OPERACIONAL - CCO

    • Editado RicardoRSV terça-feira, 28 de junho de 2016 17:35
    terça-feira, 28 de junho de 2016 17:35
  • Boa tarde,

    Experimente fazer uns testes mais ou menos dessa forma:

    with
        CTE_Pri as
        (
            select top(1) 
                hora_horimetro, 
                minuto_horimetro
            from PTP001_Ana
            where 
                TimeStamp between @DataIni and @DataFim
            order by 
                TimeStamp
        ),
    
        CTE_Ult as
        (
            select top(1) 
                hora_horimetro, 
                minuto_horimetro
            from PTP001_Ana
            where 
                TimeStamp between @DataIni and @DataFim
            order by 
                TimeStamp desc
        ),
    
        CTE_Dif as
        (
            select 
                p.hora_horimetro as pri_hora_horimetro,
                p.minuto_horimetro as pri_minuto_horimetro,
                u.hora_horimetro as ult_hora_horimetro,
                u.minuto_horimetro as ult_minuto_horimetro,
                (u.hora_horimetro * 60 + u.minuto_horimetro) -
                (p.hora_horimetro * 60 + p.minuto_horimetro) as dif_minutos
            from CTE_Pri as p
            cross join CTE_Ult as u
        )
    
    select
        *,
        cast(dif_minutos / 60 as varchar(5)) + ':' +
        Right('0' + cast(dif_minutos % 60 as varchar(2)), 2) as Diferenca
    from CTE_Dif

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta RicardoRSV terça-feira, 28 de junho de 2016 20:20
    terça-feira, 28 de junho de 2016 19:51
  • Agora funcionou corretamente

    Obrigado "gapimex" e Reginaldo


    PAULO RICARDO CENTRO DE CONTROLE OPERACIONAL - CCO

    • Editado RicardoRSV terça-feira, 28 de junho de 2016 20:20
    terça-feira, 28 de junho de 2016 20:20