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

поэтому из этих данных нужно среднее время или/и сумма этих данных


person user2158645    schedule 11.03.2013    source источник
comment
Вам нужно умножить «2013-01-13 08:00» на целое число?   -  person Mike Sherrill 'Cat Recall'    schedule 12.03.2013
comment
Как бы вы хотели умножить значения Date и Integer? Каким должен быть результат для 12/12/2012 * 12?!   -  person MarcinJuraszek    schedule 12.03.2013
comment
Если вы возьмете среднее значение всех строк и умножите его на количество строк, разве это не то же самое, что сумма всех строк?   -  person Colin Mackay    schedule 12.03.2013
comment
Можете ли вы опубликовать некоторые образцы данных?   -  person Taryn    schedule 12.03.2013
comment
Хорошо, позвольте мне быть более точным, поэтому у меня есть формат данных времени, например, 00:01:30, Колин Маккей, вы правы, это то же самое, что и сумма всех строк, но снова есть проблема со значениями времени суммы   -  person user2158645    schedule 12.03.2013
comment
Итак, TIME используется для хранения длительности? Можете ли вы показать несколько строк образцов данных и желаемые результаты?   -  person Aaron Bertrand    schedule 12.03.2013
comment
хм, очевидно, я здесь новенький, поэтому данные, которые я публикую, выглядят, ну, не так, как я хотел, поэтому прошу прощения   -  person user2158645    schedule 12.03.2013
comment
И если сумма превышает 24 часа, что вы хотите отобразить? Тип данных TIME не может этого сделать.   -  person Aaron Bertrand    schedule 12.03.2013
comment
сумма никогда не будет биться более чем за 24 часа   -  person user2158645    schedule 12.03.2013


Ответы (4)


Вы должны быть в состоянии использовать что-то похожее на следующее:

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 с демонстрацией.

Это преобразует данные times в datetime, затем в float, чтобы вы могли получить avg/sum, затем вы конвертируете значение обратно в datetime и, наконец, в time

person Taryn    schedule 11.03.2013

Вы можете сделать это, выполнив кучу арифметических операций с датами:

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 часов). Вместо этого вы должны сохранить время начала и окончания события. Вы всегда можете рассчитать продолжительность (и среднюю продолжительность), если у вас есть две конечные точки.

person Aaron Bertrand    schedule 11.03.2013
comment
Я не знаю, почему я попытался ответить, когда увидел, что вы прокомментировали. - person Taryn; 12.03.2013
comment
@bluefeet ха-ха, твой ответ тоже хорош, хотя я думаю, что на мой вкус слишком много актеров. :-) - person Aaron Bertrand; 12.03.2013
comment
да, я сохранил начальную и конечную точки для события, но я подумал, что будет проще рассчитать продолжительность, а затем работать с ней - person user2158645; 12.03.2013
comment
@ user2158645 нет, это не так. Особенно, если вы сохраняете продолжительность, используя TIME - по сути, вы просто префиксировали продолжительность и сделали невозможным выполнение регулярных вычислений против нее. - person Aaron Bertrand; 12.03.2013
comment
@AaronBertrand спасибо за совет, затем я попытаюсь рассчитать среднее значение и сумму из конечных точек. - person user2158645; 12.03.2013
comment
@aaron Я никогда не говорил, что мой ответ был красивым. :) - person Taryn; 12.03.2013

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

Демонстрация: http://sqlfiddle.com/#!3/f8c09/2

select sum(datediff(millisecond,0,mytime)) TotalTime
from t
person Kaf    schedule 11.03.2013

Это может быть полезно в этом и подобных сценариях.

Ниже будет преобразована дата/время в количество минут с полуночи. Другими словами, время, выраженное целым числом. Вы можете сделать среднее значение, а затем преобразовать обратно во время.

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])
person Community    schedule 03.06.2015