Somar Campos de Time(7) SQL

SQL Server

18/05/2015

Boa tarde Gostaria de saber como somar Colunas no SQL que o tipo de Dados são (Time (7))
e colocar essa foma no GridView [img]http://arquivo.devmedia.com.br/forum/imagem/419440-20150518-174733.jpg[/img]
Ivanilson Almeida

Ivanilson Almeida

Curtidas 0

Melhor post

Marcos P

Marcos P

19/05/2015

Ivanilson,

A ideia é converter tudo para segundos, somar em segundos e "re-converter" para a picture "hh:mm:ss".
declare @T int

set @T = (SELECT sum(DATEPART(SECOND, [Total]) + 
                     (DATEPART(MINUTE, [Total])* 60)+ 
                     (DATEPART(HOUR, [Total]))*3600) as 'TempoSegundos' 
          FROM Tabela)

SELECT CONVERT(varchar, DATEADD(ms, @T * 1000, 0), 114) 

Preparei um exemplo no Fiddle.

Qualquer dúvida, é só perguntar...
GOSTEI 1

Mais Respostas

Marcos P

Marcos P

18/05/2015

Quais as colunas e os tipos de dados envolvidos ?

Qual a versão do Sql Server ?

No seu exemplo a ideia é somar os valores da coluna "Total" ?
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Id int
Registro int
Horainicio time(7)
Horafim time(7)
Total time(7)
Data datetime2(7)
Motivo nvarchar(MAX)

SQL/2014

Peço desculpa pelo minha Falta de atenção é a primeira vez que uso um Fórum
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Marcos valeu pela dedicação agora como eu faço para colocar isso no GridView a linguagem é C# estou colocando na plataforma asp.net
Desculpa pelo incomodo Obrigado
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Como seu post original tinha a TAG ( sql server ), vim lhe ajudar por conta disso.

Na parte de programação não consigo te auxiliar, mas, pelo menos, você já sabe como fazer a query no banco de dados.

Tente mudar a TAG do post para alguma linguagem do forum ou abrir um novo tópico nesse sentido...
GOSTEI 1
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Obrigado Mesmo Pela sua atenção Ajudou muito mesmo
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Marcos Uma pergunta e quando passa de 24:00 como que faz ?
ex: um registro tem mais de 24:00 tipo ele tem 36:00 horas como fazer para visualizar ?
GOSTEI 0
Marcos P

Marcos P

18/05/2015

A query acumula a quantidade no formato "hh:mm:ss"... no caso de uma quantidade de horas superior ao 24, a rotina incrementa a hora normalmente : 25, 26, 27...
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Poderia mandar um exemplo: ?
Por favor:
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Cometi um erro... o código anterior era limitado as 24 horas do dia !

Para trabalhar com horas ilimitadas, faça :
declare @T int
declare @seg decimal(18,3), @min int, @hor int

set @T = (SELECT sum(DATEPART(SECOND, [Total]) + 
                     (DATEPART(MINUTE, [Total])* 60)+ 
                     (DATEPART(HOUR, [Total]))*3600) as 'TempoSegundos' 
          FROM Tabela)    

set @hor = convert(int, @T /60 / 60)
set @min = convert(int, (@T / 60) - (@hor * 60 ))
set @seg = @T % 60
 
select convert(varchar(9), convert(int, @hor)) + ':' +
       right('00' + convert(varchar(2), convert(int, @min)), 2) + ':' +
       right('00' + convert(varchar(6), @seg), 6)


Coloquei novos registros no Fiddle para você testar...
GOSTEI 1
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Marcos Agora sim Deu Certo Só Mais uma Duvida Como eu faço para Relacionar esse comando com outra tabela tipo a onde tem os nomes dos funcionários ?

se não for pedir muito Teria como mandar um exemplo ?
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Qual a estrutura das tabelas envolvidas e qual a chave que relaciona os registros entres as tabelas ?
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

è a Tabela [Ficha de registro]

Registro int
Nome nvarchar(100)

e outra é a tabela hora

Id int
Registro int
Horainicio time(7)
Horafim time(7)
Total time(7)
Data datetime2(7)
Motivo nvarchar(MAX)
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

A chave é o Registro
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Assumindo que você quer relacionar as ocorrências da tabela "Hora" com os nomes dos sujeitos, fica :
select hor.Registro, fic.Nome, hor.Horainicio, hor.Horafim, hor.Total, hor.Data, hor.Motivo
from hora hor inner join ficha fic on ( hor.registro = fic.registro )

Registros na tabela "Hora" sem o correspondente nome na tabela "Ficha", não serão selecionados !
GOSTEI 1
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Obrigado Marcos Pela sua ajuda Só tenho que Agradecer Conseguir Resolver um problema com a sua ajuda Obrigado mesmo Que Jeová venha De Ajudar muito em sua caminhada

Provérbios 3:27
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Bom Dia Gostaria de Saber como Faso para Somar Essas Horas e colocar Isso Na tabela de 100% Obrigado Pela atenção

Registro int
Hora_1 time(7)
Hora_2 time(7)
Hora_3 time(7)
Hora_4 time(7)
Hora_5 time(7)
Hora_6 time(7)
Data datetime
Hora_extra_100 time(7)
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Você deseja somar todas as colunas Hora_1, Hora_2... da tabela

ou

deseja somar essas sete colunas ( time ) para cada uma das linhas da tabela ?
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Todas Horas
GOSTEI 0
Marcos P

Marcos P

18/05/2015


Todas Horas


Totalizando as colunas ou somando todas de uma linha ?
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Todas de uma Linha Ex: para saber o quando de Extra o cara Fez Teria como ?
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Basta adaptar o código que lhe passei para determinar a quantidade de segundos a partir da soma de todas as horas...

declare @T int
declare @seg decimal(18,3), @min int, @hor int

set @T = (SELECT (DATEPART(SECOND, [Hora_1]) + 
                  (DATEPART(MINUTE, [Hora_1])* 60)+ 
                  (DATEPART(HOUR, [Hora_1]))*3600) + 
                 (DATEPART(SECOND, [Hora_2]) + 
                  (DATEPART(MINUTE, [Hora_2])* 60)+ 
                  (DATEPART(HOUR, [Hora_2]))*3600) +
                 (DATEPART(SECOND, [Hora_3]) + 
                   (DATEPART(MINUTE, [Hora_3])* 60)+ 
                   (DATEPART(HOUR, [Hora_3]))*3600) +
                 (DATEPART(SECOND, [Hora_4]) + 
                   (DATEPART(MINUTE, [Hora_4])* 60)+ 
                   (DATEPART(HOUR, [Hora_4]))*3600) +
                 (DATEPART(SECOND, [Hora_5]) + 
                   (DATEPART(MINUTE, [Hora_5])* 60)+ 
                   (DATEPART(HOUR, [Hora_5]))*3600) +
                 (DATEPART(SECOND, [Hora_6]) + 
                   (DATEPART(MINUTE, [Hora_6])* 60)+ 
                   (DATEPART(HOUR, [Hora_6]))*3600) +
                 (DATEPART(SECOND, [Hora_extra_100]) + 
                   (DATEPART(MINUTE, [Hora_extra_100])* 60)+ 
                   (DATEPART(HOUR, [Hora_extra_100]))*3600) as 'TempoSegundos'
          FROM Tabela)    
 
set @hor = convert(int, @T /60 / 60)
set @min = convert(int, (@T / 60) - (@hor * 60 ))
set @seg = @T % 60
  
select convert(varchar(9), convert(int, @hor)) + ':' +
       right('00' + convert(varchar(2), convert(int, @min)), 2) + ':' +
       right('00' + convert(varchar(6), @seg), 6)
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Coloque um ( WHERE ) na query acima para selecionar apenas o registro que você precisa... e tá feito !
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Basta adaptar o código que lhe passei para determinar a quantidade de segundos a partir da soma de todas as horas...

declare @T int
declare @seg decimal(18,3), @min int, @hor int

set @T = (SELECT (DATEPART(SECOND, [Hora_1]) + 
                  (DATEPART(MINUTE, [Hora_1])* 60)+ 
                  (DATEPART(HOUR, [Hora_1]))*3600) + 
                 (DATEPART(SECOND, [Hora_2]) + 
                  (DATEPART(MINUTE, [Hora_2])* 60)+ 
                  (DATEPART(HOUR, [Hora_2]))*3600) +
                 (DATEPART(SECOND, [Hora_3]) + 
                   (DATEPART(MINUTE, [Hora_3])* 60)+ 
                   (DATEPART(HOUR, [Hora_3]))*3600) +
                 (DATEPART(SECOND, [Hora_4]) + 
                   (DATEPART(MINUTE, [Hora_4])* 60)+ 
                   (DATEPART(HOUR, [Hora_4]))*3600) +
                 (DATEPART(SECOND, [Hora_5]) + 
                   (DATEPART(MINUTE, [Hora_5])* 60)+ 
                   (DATEPART(HOUR, [Hora_5]))*3600) +
                 (DATEPART(SECOND, [Hora_6]) + 
                   (DATEPART(MINUTE, [Hora_6])* 60)+ 
                   (DATEPART(HOUR, [Hora_6]))*3600) +
                 (DATEPART(SECOND, [Hora_extra_100]) + 
                   (DATEPART(MINUTE, [Hora_extra_100])* 60)+ 
                   (DATEPART(HOUR, [Hora_extra_100]))*3600) as 'TempoSegundos'
          FROM Tabela)    
 
set @hor = convert(int, @T /60 / 60)
set @min = convert(int, (@T / 60) - (@hor * 60 ))
set @seg = @T % 60
  
select convert(varchar(9), convert(int, @hor)) + ':' +
       right('00' + convert(varchar(2), convert(int, @min)), 2) + ':' +
       right('00' + convert(varchar(6), @seg), 6)
Mensagem 512, Nível 16, Estado 1, Linha 4
A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, <, <= , >, >= ou quando ela é usada como uma expressão.
Deu Essa Mensagem
GOSTEI 0
Marcos P

Marcos P

18/05/2015


Coloque um ( WHERE ) na query acima para selecionar apenas o registro que você precisa... e tá feito !
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015


Coloque um ( WHERE ) na query acima para selecionar apenas o registro que você precisa... e tá feito !
declare @T int
declare @seg decimal(18,3), @min int, @hor int

set @T = (SELECT (DATEPART(SECOND, [Hora_1]) +
(DATEPART(MINUTE, [Hora_1])* 60)+
(DATEPART(HOUR, [Hora_1]))*3600) +
(DATEPART(SECOND, [Hora_2]) +
(DATEPART(MINUTE, [Hora_2])* 60)+
(DATEPART(HOUR, [Hora_2]))*3600) +
(DATEPART(SECOND, [Hora_3]) +
(DATEPART(MINUTE, [Hora_3])* 60)+
(DATEPART(HOUR, [Hora_3]))*3600) +
(DATEPART(SECOND, [Hora_4]) +
(DATEPART(MINUTE, [Hora_4])* 60)+
(DATEPART(HOUR, [Hora_4]))*3600) +
(DATEPART(SECOND, [Hora_5]) +
(DATEPART(MINUTE, [Hora_5])* 60)+
(DATEPART(HOUR, [Hora_5]))*3600) +
(DATEPART(SECOND, [Hora_6]) +
(DATEPART(MINUTE, [Hora_6])* 60)+
(DATEPART(HOUR, [Hora_6]))*3600) +
(DATEPART(SECOND, [Hora_extra_100]) +
(DATEPART(MINUTE, [Hora_extra_100])* 60)+
(DATEPART(HOUR, [Hora_extra_100]))*3600) as 'TempoSegundos'
FROM ponto where registro = '10651990' and Data = '2015-06-10' )

set @hor = convert(int, @T /60 / 60)
set @min = convert(int, (@T / 60) - (@hor * 60 ))
set @seg = @T % 60

select convert(varchar(9), convert(int, @hor)) + ':' +
right('00' + convert(varchar(2), convert(int, @min)), 2) + ':' +
right('00' + convert(varchar(6), @seg), 6)


Fiz assim porem não Retornou o Valor Da Soma ?
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Qual valor de @T você obteve ?
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

NULL
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Alguma dessas colunas é nula, para o registro que você selecionou ?
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

No caso a Hora_Extra_100 que esta sem Valor ?
GOSTEI 0
Alex Lekao

Alex Lekao

18/05/2015

tentando acompanhar o post.

achei interessante o esquema que apresentou sobre as horas.
GOSTEI 1
Marcos P

Marcos P

18/05/2015

Qualquer dessas colunas que tiver valor NULL, vai representar erro na soma...

Para resolver pesquise sobre a função ISNULL() no Sql Server e insira isso em cada uma das somas...
( se seu Sql Server for igual ao 2008 )

Estou sem tempo agora, mas posso ver isso na sequencia.
GOSTEI 0
Marcos P

Marcos P

18/05/2015

Não testei, mas deve funcionar no Sql Server 2008 ( ou superiores )...

declare @T int
declare @seg decimal(18,3), @min int, @hor int

set @T = (SELECT ISNULL((DATEPART(SECOND, [Hora_1]) + 
                        (DATEPART(MINUTE, [Hora_1])* 60)+ 
                        (DATEPART(HOUR, [Hora_1]))*3600),0) + 
                 ISNULL((DATEPART(SECOND, [Hora_2]) + 
                        (DATEPART(MINUTE, [Hora_2])* 60)+ 
                        (DATEPART(HOUR, [Hora_2]))*3600),0) + 
                 ISNULL((DATEPART(SECOND, [Hora_3]) + 
                        (DATEPART(MINUTE, [Hora_3])* 60)+ 
                        (DATEPART(HOUR, [Hora_3]))*3600),0) + 
                 ISNULL((DATEPART(SECOND, [Hora_4]) + 
                        (DATEPART(MINUTE, [Hora_4])* 60)+ 
                        (DATEPART(HOUR, [Hora_4]))*3600),0) + 
                 ISNULL((DATEPART(SECOND, [Hora_5]) + 
                        (DATEPART(MINUTE, [Hora_5])* 60)+ 
                        (DATEPART(HOUR, [Hora_5]))*3600),0) + 
                 ISNULL((DATEPART(SECOND, [Hora_6]) + 
                        (DATEPART(MINUTE, [Hora_6])* 60)+ 
                        (DATEPART(HOUR, [Hora_6]))*3600),0) + 
                 ISNULL((DATEPART(SECOND, [Hora_extra_100]) + 
                        (DATEPART(MINUTE, [Hora_extra_100])* 60)+ 
                        (DATEPART(HOUR, [Hora_extra_100]))*3600),0) as 'TempoSegundos'
          FROM ponto 
          WHERE registro = '10651990' and Data = '2015-06-10') 
  
set @hor = convert(int, @T /60 / 60)
set @min = convert(int, (@T / 60) - (@hor * 60 ))
set @seg = @T % 60
   
select convert(varchar(9), convert(int, @hor)) + ':' +
       right('00' + convert(varchar(2), convert(int, @min)), 2) + ':' +
       right('00' + convert(varchar(6), @seg), 6)


Se seu Sql Server for inferior ao 2008, troque ISNULL por um case que retorne "0", sempre que a data for nula !
GOSTEI 0
Marcos P

Marcos P

18/05/2015

E aí Ivanilson... como estamos com esse problema ?

A última instrução que passei resolveu ?
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

Bom dia Marcos então Esta com o mesmo Resultado
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

O meu SQL é 2014
GOSTEI 0
Marcos P

Marcos P

18/05/2015

A query com ISNULL apresentou erro de sintaxe ?

O @T continua sendo gerado como NULL, mesmo com o ISNULL ?

Tentou trocar o ISNULL por um case ?

Se preferir, podemos conversar por skype ou gtalk.... coloque teu endereço aqui, que eu te chamo.
GOSTEI 0
Ivanilson Almeida

Ivanilson Almeida

18/05/2015

A query com ISNULL apresentou erro de sintaxe ? <<< Não

O @T continua sendo gerado como NULL, mesmo com o ISNULL ? <<< Sim

Tentou trocar o ISNULL por um case ? Não

Se preferir, podemos conversar por skype ou gtalk.... coloque teu endereço aqui, que eu te chamo.

Só tenho Email : ivanilsonsk8@gmail.com
GOSTEI 0
POSTAR