none
Soma de horas no sql server RRS feed

  • Pergunta

  • Pessoal,

    Bom Dia!!

    Mais uma vez preciso da ajuda de vocês. Preciso realizar soma de horarios para diversos registros no banco.

    Por exemplo:

    356 000617 87 1 2010-08-02 07:45:01.000
    357 000617 87 2 2010-08-02 13:15:20.000
    358 000617 87 3 2010-08-02 14:15:34.000

     

    Através do código 000617, preciso somar a quantidade de horas.

     

    Obrigado pela ajuda.

    Abraços


    System.NullReferenceException - Object reference not set to an instance of an object
    terça-feira, 7 de dezembro de 2010 12:01

Respostas

Todas as Respostas

  • Bom Dia,

    Você deseja somar os horários ? Poderia exemplificar ?
    Não entendi bem a lógica de "somar" esses horários

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 7 de dezembro de 2010 12:14
  • Olá Gustavo,

     

    Eu preciso somar datas no mesmo dia, por exemplo:

     

    356 000617 87 1 2010-08-02 07:45:01.000
    357 000617 87 2 2010-08-02 13:15:20.000
    358 000617 87 3 2010-08-02 14:15:34.000

     

    Na data do dia 02/08 somar (07:45 + 13:15 + 14:15) preciso chegar em 35:15

     

    Obrigado.


    System.NullReferenceException - Object reference not set to an instance of an object
    terça-feira, 7 de dezembro de 2010 12:32
  • Bom Dia,

    Somar por somar é fácil:

    declare @t table (cod char(6), data datetime)
    insert into @t values ('000617','2010-08-02 07:45:01.000')
    insert into @t values ('000617','2010-08-02 13:15:20.000')
    insert into @t values ('000617','2010-08-02 14:15:34.000')
    
    select
     cod,
     CAST(Horas As VARCHAR(4)) + ':' +
     RIGHT('0' + CAST(Minutos As VARCHAR(2)),2) + ':' +
     RIGHT('0' + CAST(Segundos As VARCHAR(2)),2) FROM (
     select cod, (DifS /3600) As Horas, (DifS % 3600) / 60 As Minutos, (DifS % 60) As Segundos
     from (
     select cod, sum(datediff(ss,convert(char(8),data,112),data)) As DifS
     from @t where cod = '000617' group by cod) As Q1) As Q2
    

    Maiores detalhes 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

    O que não entendo é qual é a lógica de somar vários horários em um mesmo dia. Se um dia tem 24 horas, como pode uma soma de um dia dar 35 horas ? Não entendi essa lógica. Se for uma folha de ponto não é assim que funciona.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 7 de dezembro de 2010 12:51
  • Obrigado pela força.

    Abraços


    System.NullReferenceException - Object reference not set to an instance of an object
    terça-feira, 7 de dezembro de 2010 13:10
  • Achei esse post sem querer e mesmo sendo antigo achei uma solução depois de ver o código Claudio postado nesse Função de Conversão
    Ele usa como valor de entrada VarChar, como no SQLServer 2012 existe o tipo TIME fiz essa função abaixo

    CREATE FUNCTION FN_CONVERT_HORAS ( @DT TIME )
    RETURNS INT
    AS BEGIN
    	DECLARE @HORA INT, @MINUTOS INT, @RETORNO INT;
    	SET @HORA = DATEPART(HOUR, @DT);
    	SET @MINUTOS = DATEPART(MINUTE, @DT);
    	SET @RETORNO = (@HORA * 60 ) + @MINUTOS
    RETURN @RETORNO
    END


    Dentro do SSMS fiz o teste onde pego duas horas, mostrando a hora e a soma delas depois de convertido

    SELECT TVOO, SUM(dbo.FN_CONVERT_HORAS(TVOO)) as MINUTOS FROM CRUISE WHERE ID_CRUISE in (50,51) GROUP BY TVOO

    Outra forma

    SELECT DBO.FN_CONVERT_HORAS('01:00') + DBO.FN_CONVERT_HORAS('00:30') as MINUTOS

    • Editado carloshfernandes quinta-feira, 27 de junho de 2013 21:18 edição estrutura correta
    quinta-feira, 27 de junho de 2013 21:14