2013-03-11 176 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])