2016-04-28 17 views
1

私は単純なSQLクエリと思っていたことに苦労しています。 SQL Serverの2014SQLクエリ - 日時フィールドからの平均時間

実行私はSQLテーブルを持って、「訪問」:

Id | EntryTime | Duration 

そして、私はこれらの日付の間の口座にすべてのレコードを取って、2つの日付の間の1日平均入力時間を見つけたいです。

私の日付の間に私のEntryTimeフィールドがある場合はそう:日付は全く考慮すべきではありません

10:00:00 

、それ:

2016-04-28 12:00:00 
2016-04-20 10:00:00 
2016-04-19 08:00:00 
2016-04-17 10:00:00 

次に返さ平均時間は、ちょうどべきです文字列形式、または10:00:00のみを返す形式で返す必要があります。

答えて

7
create table mytimes(
    id int identity, 
    mydatetime datetime 
) 

insert into mytimes (mydatetime) values ('2016-04-28 12:00:00') 
insert into mytimes (mydatetime) values ('2016-04-20 10:00:00') 
insert into mytimes (mydatetime) values ('2016-04-19 08:00:00') 
insert into mytimes (mydatetime) values ('2016-04-17 10:00:00') 

SELECT Cast(DateAdd(ms, AVG(CAST(DateDiff(ms, '00:00:00', cast(mydatetime as time)) AS BIGINT)), '00:00:00') as Time) 
from mytimes 
-- where mydatetime between XXX and YYY 

SELECT convert(varchar(8), Cast(DateAdd(ms, AVG(CAST(DateDiff(ms, '00:00:00', cast(mydatetime as time)) AS BIGINT)), '00:00:00') as Time)) 
from mytimes 
-- where mydatetime between XXX and YYY 

出力-110:00:00.0000000 - これは、実際のタイムタイプです必要に応じてより多くのことを行うことができます。

出力-210:00:00 - これはvarchar型として出力されます(8)

あなたがフィット

を見るように、ステップからTime型にキャスト

  • を含め、あなたのwhere句を追加します。 a DateTime
  • AVGTimeに設定すると、これはタイプTimeでサポートされないため、最初にTimeをミリ秒に変換する必要があります。
  • あなたはBigIntDateAddの結果をキャストすることができますArithmetic overflow error converting expression to data type int避けるためにバックTimeタイプ
  • ミリ秒を変換します。あるいは、millisecondsの代わりにsecondsを使用して、DateDiff関数を使用することができます。これは、結果セットが大きすぎない場合に有効です。

SO出典:

+0

出力に間違った形式が要求されました。 – GibralterTop

+1

@GibralterTop - OPは結果を指定しましたが、varcharまたはTimeと入力する必要はありません。十分に公正ではあるが、私は別の行を追加して、varchar(8)に変換して、/またはそれを取得できることを示した。 – Igor

+0

次のエラーが発生しました。「式をデータ型intに変換する算術オーバーフローエラー」 – JonnyKnottsvill

0

ヤップ、これを行うにはTime()を使用できます。

あなたのクエリは、この(適宜変更)

SELECT COUNT(*) FROM Visits WHERE TIME(EntryTime) > '06:00' AND EntryTime < '18:00'; 
+1

OPは、レコードの数、平均時間のためではありません求めています。また、 'TIME(DateTime)'はSql Serverの組み込み関数であるとは考えていません。 – Igor

1
SELECT CONVERT(TIME, DATEADD(SECOND, AVG(DATEDIFF(SECOND, 0, CONVERT(TIME, EntryTime))), 0)) 
FROM Visits 
WHERE EntryTime >= @begin AND EntryTime <= @end 

アイデアのようになったが、ここから来た:T-SQL calculating average time

+0

これは適切な時間を得ます、どのように私はmsを表示しないように端をトリミングですか? – JonnyKnottsvill