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 am' по цяло число?   -  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 Fiddle с демонстрация.

Това преобразува 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 като по-долу, за да получите сумата от продължителностите (или общото време). Просто използвайте Средно за средно.

Демо: 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