【问题标题】:Operand data type time is invalid for avg operator...?操作数数据类型时间对于 avg 运算符无效...?
【发布时间】:2012-08-01 00:53:37
【问题描述】:

我怎样才能在以下查询中平均(时间(4)):

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

我收到以下错误:

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

Duration 是类型 time(4) 例如:

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

【问题讨论】:

  • TIME 代表一个时间点。如果您尝试存储持续时间,请将其存储为整数。
  • @AaronBertrand:嗨,我不能将它存储为 int...这不是我的数据库。
  • 那么您每次都需要执行转换或其他日期操作。您应该告诉数据库所有者,他们付出了高昂的代价来使用良好的格式存储持续时间。

标签: sql sql-server


【解决方案1】:

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

【讨论】:

  • 这里的ms 是什么?
  • 根据documentation,它表示应该以毫秒为单位返回日期/时间之间的差异。
【解决方案2】:

改进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'
    

    【讨论】:

      【解决方案4】:

      看来timeavg() 方法的无效类型。有关有效数据类型的列表,请参阅 here

      此外,您似乎需要一组值,这将使您当前的查询不需要 top 10

      【讨论】:

        猜你喜欢
        • 2013-06-14
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 2021-11-29
        • 2017-06-15
        • 1970-01-01
        • 2017-01-24
        相关资源
        最近更新 更多