2017-12-12 4 views
0

私はいくつかの質問を検索しましたが、すべてが私の質問に正確に答えていません。そこで、ここでこの問題を提起した。私は、テーブルがあると言う 'テーブル'は、DateTime、ID、コードと期間が列です。 DateTimeには'2017-12-12 00:30:00','2017-12-12 00:30:37'などのデータがあり、この間隔の日付に基づいて期間列をSUMする必要があります。 日時が「2017年12月12日夜12時30分○○秒」であるならば、私たちのクエリは'2017-12-12 00:00:00' to '2017-12-12 00:30:00' 間のすべてのデータを合計し、「2017年12月12日午後12時00分00秒」でそれを表示する必要があります前の半時間間隔で更新する必要があるDateTimeに基づく期間の合計

実際のテーブルデータ。

DateTime ID Code Duration 
2017-12-12 00:30:00 1 12 1800 
2017-12-12 00:30:37 1 12 37 
2017-12-12 01:00:00 1 12 1793 
2017-12-12 01:30:00 1 12 1800 
2017-12-12 01:30:59 1 12 59 

私はその後、予想結果は、クエリを実行する場合、私は私と一緒に持って

DateTime ID Code Duration 
2017-12-12 00:00:00 1 12 1800 
2017-12-12 00:30:00 1 12 1800 
2017-12-12 01:00:00 1 12 1800 
2017-12-12 01:30:00 1 12 59 

クエリは、私が取得しています出力は、

ある

 SELECT 
     Interval=(CASE WHEN datepart(MINUTE,[DateTime]) = 0 and datepart(SS,DateTime)=0 THEN 
CAST(CONVERT(VARCHAR(30),DATEADD(HOUR,-1,[DateTime]),101) + ' '+ cast(format(DATEPART(HOUR,DATEADD(HOUR,-1,[DateTime])),'0#') 
as varchar)+':30:00' as DateTime) 
ELSE (CAST(CONVERT(VARCHAR(30),[DateTime],101) +' ' + (case when datepart(MINUTE,[DateTime])<=30 then cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':00:00' 
     else cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':30:00' end) as DateTime)) END),  
     ID,Code,Duration=SUM(Duration) FROM Table 
     WHERE [DateTime] >= '2017-12-11 00:00:00' and [DateTime] <= '2017-12-11 23:59:59' 
     GROUP BY ID,Code, 
     (CASE WHEN datepart(MINUTE,[DateTime]) = 0 and datepart(SS,DateTime)=0 THEN 
CAST(CONVERT(VARCHAR(30),DATEADD(HOUR,-1,[DateTime]),101) + ' '+ cast(format(DATEPART(HOUR,DATEADD(HOUR,-1,[DateTime])),'0#') as varchar)+':30:00' as DateTime) 
ELSE (CAST(CONVERT(VARCHAR(30),[DateTime],101) +' ' + (case when datepart(MINUTE,[DateTime])<=30 then cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':00:00' 
     else cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':30:00' end) as DateTime)) END) 

、以下の通りです

DateTime ID Code Duration 
2017-12-12 00:00:00 1 12 1837 
2017-12-12 00:30:00 1 12 1793 
2017-12-12 01:00:00 1 12 1859 

私がここに犯した間違いは秒の部分は分割されず、次の間隔の代わりに前の間隔に加算されます。要点は、30分間隔のDateTimeで1800秒を超えるはずがないということです。

さらに詳しい説明が必要な場合は、私がさらに明確になることをお知らせください。

答えて

1

使用シンプルな日付ロジック

GROUP BY DATEADD(MINUTE 
    , (DATEDIFF(MINUTE, [DateTime], '2017-12-12')/30) * 30 
    , '2017-12-12') 

これは、DateTime列を任意の残部を破棄、シード値から30分のセグメントに(あなたが列名などのキーワードを使用しないでください)分割します。次に、バケットのシード値から分数を取得するために30を再び掛けます。最後に、シード値に分を加えて日時バケットを作成します。

シードの日付の値は重要ではありませんが、シードの時間の値は、バケットを30分に合わせるために違いがあります。真夜中を使うのが一番クリーンなアプローチです。

+0

クエリが機能しません。私はyyyy-mm-dd hh:mm:ss形式をチェックしたいのですが、クエリはyyyy-mm-ddしか持っていません。 –

+0

最初の列をyyyy-mm-dd hh:mm:ssにフォーマットしてください。 –

+0

@SathiyaKumar DateAddとDateDiffはdatetimeデータ型を返します。その式をクエリとして使用すると、地域の形式で表示されるdatetime列が返されます。 –

関連する問題