none
Calcular média de campo datetime?

    Question

  • Bom dia, preciso calcular a média de um campo datetime, o avg ñ funciona. Ex.: tenho um intervalo de datas entre 01/01/2009 até 25/01/2009. Como faço?

    Att.,

    Monday, July 27, 2009 2:08 PM

All replies

  • Luciobinho,

    Fiz um teste e acho que este script pode resolver seu problema, uma vez que não se pode usar o avg com datas.

    declare @data1 datetime , @data2 datetime 
    set @data1 ='20090101' 
    set @data2 ='20090125'
    
    select dateadd(day,(datediff(dd,@data1,@data2)/2),@data1)
    

    Att.

    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Monday, July 27, 2009 3:45 PM
  • Marcelo,

    Eu já precisei realizar esta cálculo de média para campos datatime e utilizei uma solução muito parecida com a sua.

    Luciobinho,

    Este cálculo de média deverá retornar qual informação?


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    Monday, July 27, 2009 4:02 PM
  • Bom Dia,

    Acho que você poderia utilizar algo um pouco mais apurado, pois, nem sempre você terá somente duas datas para trabalhar:

    DECLARE @T TABLE (DATA SMALLDATETIME)
    INSERT INTO @T VALUES ('20090101')
    INSERT INTO @T VALUES ('20090102')
    INSERT INTO @T VALUES ('20090103')
    INSERT INTO @T VALUES ('20090104')
    INSERT INTO @T VALUES ('20090108')
    INSERT INTO @T VALUES ('20090111')
    INSERT INTO @T VALUES ('20090112')
    INSERT INTO @T VALUES ('20090115')
    INSERT INTO @T VALUES ('20090117')
    INSERT INTO @T VALUES ('20090125')
    


    -- Saber o "dia médio" SELECT DATEADD(D,AVG(DATEDIFF(D,'20090101',DATA)),'20090101') FROM @T


    Há muitos detalhes úteis em:

    Como realizar cálculos com horas no SQL Server – Parte I
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!516.entry

    Como realizar cálculos com horas no SQL Server – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!532.entry

    Como realizar cálculos com horas no SQL Server – Parte III
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!534.entry

    Como realizar cálculos com horas no SQL Server – Parte IV
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!536.entry

    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Mitos do SQL Server – Será que COUNT(1) ou COUNT('X') são mais performáticos que COUNT(*) ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!658.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Proposed as answer by Fausto Branco Thursday, May 27, 2010 12:06 PM
    Tuesday, July 28, 2009 10:03 AM
  • Maia,

    Muito legal, este script.

    No meu caso quando precisei de algo parecido, eu primeiramente contei a quantidade de dias e com este resultado realizei a divisão.

    Não utilizei a função AVG.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    Tuesday, July 28, 2009 2:32 PM
  • Não precisa nada disso, faz assim: CONVERT(varchar(8),CAST(avg(CAST((datahora_fim-datahora_inicio) AS FLOAT)) AS DATETIME),8) as media Ou adapte o código à sua necessidade.
    Wednesday, May 26, 2010 1:58 PM
  • fsouzarj,

    Sua sugestão é interessante, mas realizar conversão de dados de forma implicita obriga o SQL Server a realizar uma série de procedimento inclusive no seu plano de execução para processar esta query.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    Wednesday, May 26, 2010 7:04 PM
  • Fsouzarj, não há necessidade de tudo isso. Dê uma olhada no que o Maia te passou, é de longe a melhor opção. Você não precisa fazer Casts e Converts que deixam o código dificil de entender e acaba prejudicando a execução

    Sempre que você faz um DateDiff de uma data a partir da data "0"  - DateDiff(d, 0, Getdate()) ou '20090101' no exemplo do Maia - ele retorna a quantidade (int se não me engano) em dias da sua data. Com essa quantidade é só fazer o AVG e em seguida o DateAdd adiciona essa media de dias à data 0, então você tem sua data média.

     

     

     


    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    Thursday, May 27, 2010 12:06 PM
  • Sua dica foi muito boa....

     

    Funcionou direitinho...


    -- Viviane Almeida
    Wednesday, July 20, 2011 3:03 PM