none
Média hora campo varchar RRS feed

  • Pergunta

  • Pessoal, boa tarde! 

    Tenho a consulta abaixo, onde o campo ZF0_TEMPRE é do tipo varchar e armazena horas:minutos. 

    Precisava retornar a média de tempo entre os registros selecionados. Alguém tem uma idéia de como posso fazer?

    Estes tempos podem ultrapassar 24 horas.

    select top 10 SUBSTRING(ZF0_LOTECT,1,6) REACAO,
    ZF0_REATOR REATOR, ZF0_QTDCOB ANEIS, ZF0_SUSP SUSP, ZF0_PARTIC TAMANHO_PARTICULA, 
    ZF0_MOLHAB MOLHA, ZF0_TEMPRE TEMPO_REACAO, ZF0_PB CHUMBO, ZF0_CD CADMIO, 
    ZF0_AS ARSENIO,ZF0_MP197 ANTISPUMANTE,YEAR(GETDATE()) ANO
    from ZF0010(NOLOCK)
    where D_E_L_E_T_ = ''
    and ZF0_STATUS = 'E'
    and ZF0_DTINAM BETWEEN '20210101' and '20211231'
    ORDER BY SUBSTRING(ZF0_LOTECT,1,6)

    segunda-feira, 10 de maio de 2021 16:51

Todas as Respostas

  • Boa tarde,

    Você pode postar um exemplo com uma pequena amostra de dados e o respectivo resultado esperado?


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

    segunda-feira, 10 de maio de 2021 17:30
  • opa, segue um exemplo de como retornam os dados.

    A média do campo TEMPO_REACAO neste exemplo é 17:14. Esta consulta será usada em uma ferramenta de report que consegue calcular a média entre os registros, mas por se tratar de campo varchar aí ela não entende. 

    Preciso que o campo TEMPO_REACAO retorne de uma forma que consiga fazer um AVG nele. 

    REACAO REATOR ANEIS SUSP TAMANHO_PARTICULA MOLHA TEMPO_REACAO CHUMBO CADMIO ARSENIO ANTISPUMANTE
    140-21 10 2,00 90,01 3,44 20 17:30 91,53 1 1 1,00
    139-21 6 2,50 91,27 3,98 9 16:20 59,17 1 1 1,00
    138-21 4 2,50 91,06 3,11 6 17:30 241,7 1 1 2,00
    128-21 10 2,50 88,70 3,63 25 15:05 92,34 1 1 1,50
    130-21 6 3,00 92,26 3,53 39 20:15 73,91 1 1 6,00
    134-21 10 3,00 91,53 3,20 22 16:10 78,06 1 1 6,50
    133-21 6 2,50 90,20 3,93 22 15:20 66,08 1 1 1,50
    131-21 10 3,00 87,50 4,20 25 16:10 90,95 1 1 8,50
    127-21 6 2,50 93,00 3,62 21 20:50 61,87 1 1 1,00
    Media SUSP 90,61 Media Tempo Reação 17:14

    segunda-feira, 10 de maio de 2021 17:40
  • Você tentou fazer um Cast para Time?

    cast(ZF0_TEMPRE as time) as TEMPO_REACAO


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

    segunda-feira, 10 de maio de 2021 17:53
  • Sim, ele dá erro

    Mensagem 241, Nível 16, Estado 1, Linha 12
    Conversion failed when converting date and/or time from character string.

    Não sei se daria certo também porque o tipo TIME acho que só vai até 24h. 

    segunda-feira, 10 de maio de 2021 18:01
  • Segue uma sugestão com uma base que acho que pode ser utilizada na sua consulta:

    select
        dateadd(minute, avg(TEMPO_REACAO_INT / 100 * 60 + TEMPO_REACAO_INT % 100), 0)
    from ZF0010
    cross apply
    (
        select cast(replace(TEMPO_REACAO, ':', '') as int) as TEMPO_REACAO_INT
    ) as ca

    Primeiro é feita a conversão de varchar para int com o Apply, depois é feita a conversão do horário para minutos dentro do Avg, e no final é utilizada a função DateAdd para obter o horário a partir da média em minutos obtida. Talvez falte você fazer a formatação do resultado final de acordo com o formato que você quer.

    Espero que ajude


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

    segunda-feira, 10 de maio de 2021 18:32