2013-03-11 4 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 утра» на целое число? –

+0

Как бы вы хотели умножить значения 'Date' и' Integer'? Что должно быть результатом для '12/12/2012 * 12' ?! – MarcinJuraszek

+1

Если вы берете среднее значение всех строк и умножаете его на количество строк, то это не совпадает с суммой всех строк? –

ответ

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

+0

@bluefeet ha ha, ваш ответ тоже хорош, хотя я думаю, что для меня слишком много отливок. :-) –

+0

да, я сохранил начальную и конечную точки для события, но я подумал, что будет проще рассчитать продолжительность, а затем с ней работать – user2158645

0

Предполагая, что вы сохранили продолжительность в поле времени, вы можете попробовать функцию Datediff, как показано ниже, чтобы получить сумму длительностей (или общее время). Просто используйте Среднюю среднюю величину.

Демо: 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]) 
Смежные вопросы