2016-07-27 2 views
0

大規模なSQLデータベースから時間単位でデータを抽出しようとしています。次のクエリは分単位でグループ化しています。毎時のデータでグループ化したいと思います。CONVERT {yyyy-mm-dd hh:mm:ss}から{yyyy-mm-dd hh}までの時間

select CONVERT(VARCHAR(20), t.counterTime, 100) as [Time], 
    t.instanceName 
from table as t 
WHERE t.counterId= @counterId 
and t.counterTime >= @startTime 
and t.counterTime < @endTime 
group by t.instanceName, CONVERT(VARCHAR(20), t.counterTime, 100) 

documentationもこのようなオプションを提供しません。何か案は?

+2

を試してみてください、代わりに 'char(13)'を使用してください。 –

+0

あなたのselectとgroup byで式 'CAST(t.counterTime AS DATE)'を使用してください。どのようにこの表現を思いついたのですか? –

+0

@ Nick.McDermaidのキャスティングは現在のデータを失うでしょう... –

答えて

2

あなたは、このように部分文字列を使用することができます

--SQL Server 2012 
SELECT FORMAT(t.counterTime, 'yyyy-MM-dd HH') AS [Time] 
    ,t.instanceName 
FROM TABLE AS t 
WHERE t.counterId = @counterId 
    AND t.counterTime >= @startTime 
    AND t.counterTime < @endTime 
GROUP BY t.instanceName 
    ,FORMAT(t.counterTime, 'yyyy-MM-dd HH') 

--for earlier versions 
SELECT CONVERT(CHAR(13), t.counterTime, 120) AS [Time] 
    ,t.instanceName 
FROM TABLE AS t 
WHERE t.counterId = @counterId 
    AND t.counterTime >= @startTime 
    AND t.counterTime < @endTime 
GROUP BY t.instanceName 
    ,CONVERT(CHAR(13), t.counterTime, 120) 

Note: Format would be perfoming slower. 
+0

'Format'は2012年以降のバージョンでのみ動作することに注意してください。 –

+0

あります。あなたは正しいです。Zohar – StackUser

+0

スタッフは必要ありません。 'CONVERT(Char(13)、t.counterTime、120)'は 'FORMAT(t.counterTime、 'yyyy-MM-dd HH')'と同じ文字列を返します。しかし、私はあなた自身をテストし、dba.stackexchageでAaronの答えを見つけたという事実が気に入っています。 –

0

、このようにしてみてください。

select substring(field,1,4) + '-'+ substring(field,6,2) +'-'+ substring(field,7,2)+' '+ substring(field,9,2) from dbo.youtable 
0

ははい、 `varhcar(20)を`使用しないでください。この

select datepart(hour,t.counterTime) as [Time], 
    t.instanceName 
from table as t 
WHERE t.counterId= @counterId 
and t.counterTime >= @startTime 
and t.counterTime < @endTime 
group by t.instanceName, datepart(hour,t.counterTime) 
関連する問題