操作数数据类型 time 对 avg 运算符无效...?

11

如何在以下查询中使用avg(time(4)):

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

我遇到以下错误:

avg 操作符对于数据类型为 time 的操作数无效。

Duration 是 time(4) 类型,例如:

Duration
-------------
00:00:10.0000

时间(TIME)代表了一个时间点。如果您试图存储一段持续时间,请将其存储为整数。 - Aaron Bertrand
@AaronBertrand:你好,我不能将它存储为int...因为这不是我的数据库。 - genxgeek
那么你每次都需要执行转换或其他日期操作。你应该告诉数据库所有者,他们正在支付昂贵的代价来使用漂亮的格式存储持续时间。 - Aaron Bertrand
4个回答

18
您可以使用DateDiff( ms, '00:00:00', e.Duration )将时间转换为整数毫秒数。将其用于聚合,然后将结果转换回去,例如Cast( DateAdd( ms, 1234, '00:00:00' ) as Time )

这里的 ms 是什么? - Zameer Ansari
1
根据文档,它指出日期/时间之间的差异应以毫秒为单位返回。 - HABO

9

在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

3
除了HABO和Rafi的回答之外,还有一个补充。
对于我的情况,我不得不将DATEDIFF的值转换为bigint类型,因为我的值变得太大,导致算术溢出错误。
CAST(DATEADD( ms,AVG(CAST(DATEDIFF( ms, '00:00:00', ISNULL(e.Duration, '00:00:00')) as bigint)), '00:00:00' )  as TIME) as 'avg_time'

1

看起来time对于avg()方法是无效的类型。请参考这里获取有效数据类型列表。

此外,似乎您需要一组值来完成此操作,这将取消您当前查询中top 10的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接