2013-03-11 138 views
9

我在计算平均时间时遇到问题。 这种情况下: 我有多行,在每一行有数据的时间格式 ,所以我需要计算所有行的平均时间,并将其乘以行数,但当然我有一个数据格式的问题因为我需要乘以整数时间T-SQL计算平均时间

有人可以帮我一些建议吗? 日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 
从这些数据

,使数据的需要的平均时间和/或总和

+0

您需要将“2013-01-13 08:00 am”乘以整数? – 2013-03-11 22:05:20

+0

您想如何乘以Date和Integer值? 12/12/2012 * 12'应该是什么结果?! – MarcinJuraszek 2013-03-11 22:05:28

+1

如果您取所有行的平均值并将其乘以行数,是否与所有行的总和不相同? – 2013-03-11 22:06:04

回答

7

您应该能够使用类似下面的内容:

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

8

你可以做一大堆做到这一点日期计算的:

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小时的时间,则发生故障)。相反,您应该存储事件的开始和结束时间。如果您有两个终点,您可以随时计算持续时间(和平均持续时间)。

+1

我不知道为什么我试着回答,当我看到你评论过。 – Taryn 2013-03-11 22:20:44

+0

@bluefeet哈哈,你的回答也不错,尽管我觉得有太多的演员是我喜欢的。 :-) – 2013-03-11 22:23:23

+0

是的,我已经存储了事件的开始点和结束点,但是我认为计算持续时间然后使用它会更容易 – user2158645 2013-03-11 22:39:11

0

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

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

select sum(datediff(millisecond,0,mytime)) TotalTime 
from t 
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])