T-SQL计算平均时间

时间:2013-03-11 22:02:46

标签: sql-server-2008 tsql time integer dataformat

我在计算平均时间时遇到问题。 情况就是这样: 我有多行,每行都有时间格式的数据 所以我需要计算所有行的平均时间并将其与行数相乘但当然我的数据格式有问题,因为我需要将时间与整数相乘

有人可以帮我提一些建议吗? 日Thnx 以下是一些数据:

times
00:00:00.7400000
00:00:01.1870000
00:00:00.6430000
00:00:00.6100000
00:00:12.9570000
00:00:01.1000000
00:00:00.7400000
00:00:00.5300000
00:00:00.6330000
00:00:01.6000000
00:00:02.6200000
00:00:01.0300000
00:00:01.9630000
00:00:00.9800000
00:00:01.0170000
00:00:00.7600000
00:00:00.7130000
00:00:00.9730000
00:00:01.0000000
00:00:01.0530000
00:00:02.9400000
00:00:00.8200000
00:00:00.8400000
00:00:01.1800000
00:01:25.8230000
00:00:01.0000000
00:00:00.9700000
00:00:01.2930000
00:00:01.3270000
00:00:13.5570000
00:00:19.3170000
00:00:58.2730000
00:00:01.6870000
00:00:18.7570000
00:00:42.8570000
00:01:12.3770000
00:00:01.2170000
00:00:09.9470000
00:00:01.4730000
00:00:00.9030000
00:00:01.0070000
00:00:01.1100000
00:00:01.6270000
00:00:05.0570000
00:00:00.6570000
00:00:00.7900000
00:00:03.2930000
00:00:00.8600000
00:00:01.0330000
00:00:00.9300000
00:00:00.8730000
00:00:00.9600000
00:00:00.8070000
NULL

因此,从这些数据中需要平均时间或/和该数据的总和

4 个答案:

答案 0 :(得分:11)

您应该可以使用类似于以下内容的内容:

select 
  cast(cast(avg(cast(CAST(times as datetime) as float)) as datetime) as time) AvgTime,
  cast(cast(sum(cast(CAST(times as datetime) as float)) as datetime) as time) TotalTime
from yourtable;

请参阅SQL Fiddle with Demo

这会将times数据转换为datetime,然后转换为float,这样您就可以获得avg / sum,然后将值转换回来到datetime,最后到time

答案 1 :(得分:11)

你可以通过做一堆日期算术来做到这一点:

DECLARE @t TABLE(x TIME);

INSERT @t VALUES('00:01:30'),('00:02:25'),('00:03:25');

SELECT CONVERT(TIME, DATEADD(SECOND, AVG(DATEDIFF(SECOND, 0, x)), 0)) FROM @t;

但是,您应该正在做的事情是不使用TIME来存储间隔/持续时间。 TIME用于存储某个时间点(例如,如果您需要存储超过24小时,则会发生故障)。相反,您应该存储事件的开始和结束时间。如果你有两个终点,你总是可以计算持续时间(和平均持续时间)。

答案 2 :(得分:0)

假设您在时间字段中存储了持续时间,您可以尝试使用下面的Datediff函数来获取持续时间(或总时间)的总和。只需使用平均值即可。

演示:http://sqlfiddle.com/#!3/f8c09/2

select sum(datediff(millisecond,0,mytime)) TotalTime
from t

答案 3 :(得分:0)

这在此类似场景中可能很有用。

以下将日期/时间转换为午夜以来的分钟数。换句话说,时间表示为整数。您可以对其进行平均,然后转换回时间。

declare @dt datetime = GETDATE();
select DATEDIFF(minute, dateadd(dd, datediff(dd, 0, @dt), 0), @dt);
--DATEDIFF(minute, [date without time i.e. midnight], [date/time of interest])
相关问题