web-dev-qa-db-ja.com

平均時間を計算する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

したがって、このデータから必要な平均時間または/およびそのデータの合計

16
user2158645

次のようなものが使用できるはずです。

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

15
Taryn

これを行うには、一連の日付計算を実行します。

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時間を超えて保存する必要がある場合は機能しません)。代わりに、イベントの開始時間と終了時間を保存する必要があります。 2つのエンドポイントがある場合は、期間(および平均期間)をいつでも計算できます。

11
Aaron Bertrand

時間フィールドに期間を格納していると仮定すると、以下のようなDatediff関数を試して期間(または合計時間)の合計を取得できます。単に平均の平均を使用します。

デモ: http://sqlfiddle.com/#!3/f8c09/2

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

これは、このシナリオおよび類似のシナリオで役立つ場合があります。

以下は、日付/時刻を真夜中からの分数に変換します。言い換えれば、整数として表現された時間。その上で平均をとってから、時間に戻すことができます。

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