2012-08-03 16 views
7

Como puedo AVG (tiempo (4)) en la siguiente consulta:La hora del tipo de datos del operando no es válida para el operador avg ...?

select top 10 avg(e.Duration) from TimeTable e 

Estoy recibiendo el siguiente error:

Operand data type time is invalid for avg operator.

La duración es de tipo de tiempo (4), tales como:

Duration 
------------- 
00:00:10.0000 
+0

tiempo representa un punto en el tiempo. Si intenta almacenar una duración, almacénela como un número entero. –

+0

@ AaronBertrand: Hola, no puedo almacenarlo como un int ... no es mi base de datos. – JaJ

+0

Luego tendrá que realizar una conversión u otras operaciones de fecha cada vez. Debe decirle al propietario de la base de datos que están pagando un precio considerable para almacenar una duración con un buen formato. –

Respuesta

11

Puede usar DateDiff(ms, '00:00:00', e.Duration) para convertir la hora en un número entero de milisegundos. Úselo para su agregado, luego convierta el resultado, p. Ej. Cast(DateAdd(ms, 1234, '00:00:00') as Time).

+0

¿Qué es 'ms' aquí? – xameeramir

+1

Según la [documentación] (https://msdn.microsoft.com/en-us/library/ms189794.aspx?ppud=4), indica que la diferencia entre la fecha/horas debe devolverse en unidades de milisegundos. – HABO

1

Bueno parece que time es un tipo no válido para el método avg(). Consulte here para obtener una lista de tipos de datos válidos.

Además, parece que necesita un grupo de valores para esto, lo que anularía la necesidad de top 10 con su consulta actual.

7

Mejora fuera de respuesta HABO:

select top 10 
Cast(DateAdd(ms,avg(DateDiff(ms, '00:00:00', e.Duration)), '00:00:00') as time) as 'avg duration' 
from TimeTable e 
Cuestiones relacionadas