Duvidas Somar horas

25/07/2017

0

Boa Tarde!
tenho a sentença

SELECT
DBO.FNCALCULATEMPO(INICIO,FIM)'HORAS ABONADAS'
FROM AOCORRENCIACALCULADA
LEFT JOIN ATIPOOCORRENCIA ON AOCORRENCIACALCULADA.TIPOOCORRENCIA = ATIPOOCORRENCIA.TIPOOCORRENCIA
WHERE CHAPA = '2182'
and INICIO >='2017-07-15'
ORDER BY INICIO

onde a mesma me retorna 3 linhas com as seguintes informações:

03:00:00
01:00:00
07:00:00

que são as horas abonadas, ao invés de trazer uma em cada linha gostaria de somar a mesma e me retornar em apenas uma linha com
o total de 11:00:00.

mas quando uso

SELECT
SUM(DBO.FNCALCULATEMPO(INICIO,FIM))'HORAS ABONADAS'
FROM AOCORRENCIACALCULADA
LEFT JOIN ATIPOOCORRENCIA ON AOCORRENCIACALCULADA.TIPOOCORRENCIA = ATIPOOCORRENCIA.TIPOOCORRENCIA
WHERE CHAPA = '2182'
AND INICIO >='2017-07-15'
ORDER BY INICIO
ele da o erro

'Mensagem 8117, Nível 16, Estado 1, Linha 2 Operand data type varchar is invalid for sum operator.'

como eu consigo somar estas horas?
A funcão DBO.FNCALCULATEMPO é composta pelo seguinte script:

USE [Corporerm]
GO
/****** Object: UserDefinedFunction [dbo].[fnCalculaTempo] Script Date: 07/25/2017 16:12:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fnCalculaTempo]
(
@antes DATETIME, @depois DATETIME
)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @temp DATETIME;
IF (@antes > @depois)
BEGIN
SET @temp = @antes;
SET @antes = @depois;
SET @depois = @temp;
END
RETURN CASE WHEN @temp IS NULL THEN '' ELSE '-' END
+ CASE WHEN DATEDIFF(SECOND, @antes, @depois) / 60 / 60 >=24
THEN CONVERT(VARCHAR, ABS(DATEDIFF(SECOND, @antes, @depois) / 60 / 60 / 24)) + 'd+ '
ELSE '' END
+ RIGHT('00' + CONVERT(VARCHAR, ABS(((DATEDIFF(SECOND, @antes, @depois) / 60) / 60) % 24)), 2) + ':'
+ RIGHT('00' + CONVERT(VARCHAR, ABS((DATEDIFF(SECOND, @antes, @depois) / 60) % 60)), 2) + ':'
+ RIGHT('00' + CONVERT(VARCHAR, ABS(DATEDIFF(SECOND, @antes, @depois) % 60)), 2);
END
Leandro Pinto

Leandro Pinto

Responder

Posts

04/08/2017

Luiz Vichiatto

O que você quer fazer é um agrupamento das horas, pois bem, você deve adicionar um campo para que o sql possa agrupar, por exemplo a matricula ou um código que se repita igualmente a todas as tuplas
SELECT  MATICULA,
DBO.FNCALCULATEMPO(INICIO,FIM)'HORAS ABONADAS'
FROM AOCORRENCIACALCULADA
LEFT JOIN ATIPOOCORRENCIA ON AOCORRENCIACALCULADA.TIPOOCORRENCIA = ATIPOOCORRENCIA.TIPOOCORRENCIA
WHERE CHAPA = '2182'
and INICIO >='2017-07-15'	
group by MATRICULA

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar