2016-12-06 6 views
0

クエリの取得に問題があります。私のサンプルデータに基づいています。TestDate Hourに基づいて平均経過時間を求めます特定の日にたとえば、午後1時に月曜日に12の経過時間があり、午後1時に金曜日に16の経過時間がある場合、月曜日の平均経過時間を1とし、12と金曜日を16にする午後1時に経過した時間は一般的に14です(詳しい説明については、下のクエリを参照してください)。ここでDateTimeの時間に基づいて平均値を取得するSQL

は、私が働いている私のサンプルデータです:

TestDate     ElapsedTime 
2016-12-05 15:04:47.000  00:00:54.8507507 
2016-12-05 15:04:47.000  00:00:03.8507507 
2016-12-05 11:04:47.000  00:00:14.8507507 
2016-12-05 12:04:47.000  00:00:05.8507507 
2016-12-05 13:04:47.000  00:00:07.8507507 
2016-12-09 13:04:47.000  00:00:50.8507507 
2016-12-05 13:04:47.000  00:00:04.8507507 
2016-12-05 13:04:47.000  00:00:04.8507507 
2016-12-05 13:04:47.000  00:00:04.8507507 
2016-12-05 13:04:47.000  00:00:04.8507507 
2016-12-07 13:04:47.000  00:00:04.8507507 
2016-12-09 13:04:47.000  00:00:50.8507507 

注:TestDateは日時で、経過時間がvarchar型である(それがのTimeSpanとして保存し、その後、交流の文字列に変換されますことを# 応用)。ここで

は私が平均経過時間を取得することができるが、私は日に基づいて時間を取得することはできませんよ、私のクエリ、一般的にはわずか数時間である:

Select x.TestRunTime, 
    Avg(x.ElapsedTime) As AverageElapsedTime 
FROM 
(
    SELECT 
    DATEPART(HOUR, CAST(TestDate AS TIME(6))) AS TestRunTime, 
    (DatePart(minute,Cast(ElapsedTime as Time(6))) * 60) + 
     DatePart(second,Cast(ElapsedTime as Time(6))) + 
     (DatePart(millisecond,Cast(ElapsedTime as Time(6))) * .001) 
     As ElapsedTime 
     FROM RunTimes 
) AS x 
GROUP BY x.TestRunTime 

誰も私が何を把握助けることができます私は行方不明ですか?私は私が近づいていることを知っている、私はちょうど経過時間の日のセクションを得ることができていない。

おかげで、

答えて

0

だけdatepart 1以上を追加します。また、DATEDIFFを使用して秒をms分数で取得します。

Select x.TestRunTime, 
     x.DayOfWeek,  
     Avg(x.ElapsedTime) As AverageElapsedTime 
FROM 
(
    SELECT 
    DATEPART(HOUR, TestDate) AS TestRunTime, 
    DATEPART(dw, TestDate) AS DayOfWeek, 
    DATEDIFF(ms, 0, Cast(ElapsedTime as Time(6)))/1000. as ElapsedTime 
     FROM RunTimes 
) AS x 
GROUP BY x.TestRunTime, x.DayOfWeek 

EDIT

あなたは毎時

Select x.TestRunTime, 
     Avg(x.ElapsedTime) As AverageElapsedTime 
FROM 
(
    SELECT 
    DATEADD(hh,DATEDIFF(hh,0,TestDate),0) AS TestRunTime, 
    DATEDIFF(ms, 0, Cast(ElapsedTime as Time(6)))/1000. as ElapsedTime 
     FROM RunTimes 
) AS x 
GROUP BY x.TestRunTime 
+0

私は来週ヒットたら残念ながら、私はそれが同じ列にしていない別の列になるようにしても、これは今月のために働くだろう必要がありますが、例えば、曜日がリセットされます – Volk

+0

あなたが必要とするのは、結果の中のすべてのラウンドアワーです: '2016-12-05 11:00:00.000'、 '2016-12-05 12:00:00.000'、。 ? – Serg

+0

SQLのFormat関数を使って動作させましたが、最終的には現在の日付でラウンドアワーが必要です。 – Volk

0

の平均が必要な場合、私はそれがFormat関数を使用して作業しました。ここで

は私がそれをしなかったコードです:

Select x.TestRunTime, 
    Avg(x.ElapsedTime) As AverageElapsedTime 
FROM 
(
    SELECT 
     Format(TestDate, 'MMMM dd, HH') AS TestRunTime, 
    DATEPART(dw, TestDate) AS DayOfWeek, 
    (DatePart(minute,Cast(ElapsedTime as Time(7)))) + 
    DatePart(second,Cast(ElapsedTime as Time(7))) + 
    (DatePart(millisecond,Cast(ElapsedTime as Time(7))) * .0001) 
    As ElapsedTime 
    FROM RunTimes 
) AS x 
GROUP BY x.TestRunTime, x.DayOfWeek 
関連する問題