2013-03-11 8 views
9

Mam problem z obliczaniem średniego czasu. Jest to przypadek: Mam wiele wierszy, w każdym wierszu są dane w formacie czasu , więc muszę obliczyć średni czas wszystkich wierszy i pomnożyć go z liczbą wierszy, ale oczywiście mam problem z formatem danych ponieważ muszę pomnożyć czas z liczbą całkowitąObliczanie średniego czasu T-SQL

Czy ktoś może mi pomóc z radą? thnx Oto dane:

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 

więc z tych danych potrzeba średni czas lub/i suma tych danych

+0

Musisz pomnożyć "2013-01-13 08:00 am" przez liczbę całkowitą? –

+0

Jak chcesz pomnożyć wartości "Date" i "Integer"? Jaki powinien być wynik dla '12.12.2012 * 12' ?! – MarcinJuraszek

+1

Jeśli weźmiesz średnią wszystkich wierszy i pomnożysz ją przez liczbę wierszy, czy to nie to samo, co suma wszystkich wierszy? –

Odpowiedz

7

Powinieneś móc używać coś podobnego do poniższego:

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; 

Zobacz SQL Fiddle with Demo.

ten przekształca dane times do datetime, potem float, dzięki czemu można uzyskać avg/sum, a następnie przekonwertować wartość z powrotem do datetime i wreszcie time

8

Można to zrobić wykonując kilka nieaktualny arytmetyki:

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; 

jednak to, co powinien się robi nie używa TIME do przechowywania interwał/czas trwania. TIME służy do przechowywania punktu w czasie (i rozkłada się, jeśli na przykład chcesz przechowywać więcej niż 24 godziny). Zamiast tego należy zapisać czas rozpoczęcia i zakończenia wydarzenia. Zawsze możesz obliczyć czas trwania (i średni czas trwania), jeśli masz dwa punkty końcowe.

+1

Nie wiem, dlaczego próbowałem odpowiedzieć, gdy zobaczyłem, że skomentowałeś. – Taryn

+0

@bluefeet ha ha, twoja odpowiedź też jest dobra, chociaż wydaje mi się, że jest zbyt wiele obsad na mój gust. :-) –

+0

tak, mam zapisane punkty początkowe i końcowe dla zdarzenia, ale pomyślałem, że łatwiej byłoby obliczyć czas trwania, a następnie pracować z nim – user2158645

0

Zakładając, że masz zapisany czas trwania w polu czasu, możesz spróbować funkcji Datediff, jak poniżej, aby uzyskać sumę czasów trwania (lub całkowitego czasu). Po prostu użyj Avg dla średniej.

Demo: http://sqlfiddle.com/#!3/f8c09/2

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

Może to być przydatne, w tym i w podobnych sytuacjach.

Poniżej przeliczymy datę/czas na liczbę minut od północy. Innymi słowy czas wyrażony jako liczba całkowita. Możesz zrobić średnią na tym, a następnie przekonwertować z powrotem na czas.

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])