获取 TIME(7) 的平均值

4
ProcessTime: 00:00:00.0000012
RegexResolveTime: 00:00:00.0000421
MessageResolveTime: 00:00:00.0001269 
FullProcessTime: 00:00:00.0001734

好的,我有4列数据类型为Time(7)。我需要获取这些单独列的所有条目的平均值,但Time(7)不是AVG运算符的有效类型!

如何获取Time(7)列的平均值?

我要补充说明的是,这些是持续时间而不是SQL服务器认为的离散时间点!


1
@JustinPihony,我认为不同。那个问题是关于在time之前使用varchar存储时间值的,而被接受的答案和其他几个答案在 SQL Server 2008+ 中并不是最优解,这只是我的看法... - Aaron Bertrand
1个回答

4

你不能对时间进行平均,因为时间代表一个时刻,而不是持续时间。我建议采取以下两种方法之一。

  1. 首选方法:将持续时间以毫秒、微秒、纳秒等整数形式存储,这将使您在需要更高精度时能够更准确地计算。

  2. 应用转换,让您可以对从午夜开始的时间差进行平均,而不是实际时间值。

DECLARE @x TABLE (ProcessTime TIME(7));

INSERT @x VALUES ('00:00:00.0000012'), ('00:00:00.0000016');

SELECT DATEADD(NANOSECOND, AVG(DATEDIFF(NANOSECOND, '00:00:00.0000000', ProcessTime)), 
  CONVERT(TIME, '00:00:00.0000000'))
FROM @x;

结果:

00:00:00.0000014

但是你觉得这样做不对吗?如果你不需要存储时间点,只关心持续时间,请存储持续时间。在展示时,你可以随时将其格式化为时间。


嗨,亚伦;它们是时间间隔,对应的上层实体框架(.NET)数据类型是TimeSpan!所以我想为了平均值的目的,我需要将时间间隔转换为整数;我想这就是你在那里做的事情..我会试一试。谢谢。 - Dave Lawrence
完美!给你一个金星,Aaron。 - Dave Lawrence
1
SQL Server 还未实现间隔时间,因此当你将其存储为时间时,SQL Server 认为它是一个时间点并进行处理。如果您希望在 SQL Server 的未来版本中使用时间间隔,请投票并在下面的 Connect 项目中添加您的业务案例作为评论:http://connect.microsoft.com/SQLServer/feedback/details/432281/sql-server-doesnt-have-an-ansi-interval-data-type - Aaron Bertrand

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