2016-07-27 5 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

Да, не используйте 'varhcar (20)', вместо этого используйте 'char (13)'. –

+0

Используйте выражение '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. –

0

Вы можете использовать подстроку, как это:

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

Попробуйте

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) 
Смежные вопросы