2013-10-02 45 views
1

我有一個從日誌和團體選擇到分鐘(不包括秒和毫秒爲單位)的情況如下:有沒有更好的方法來將日誌分組?

SELECT DATEPART(YEAR, [Date]) AS YEAR, DATEPART(MONTH, [Date]) AS MONTH, 
     DATEPART(DAY, [Date]) AS DAY, DATEPART(HOUR, [Date]) AS HOUR, 
     DATEPART(MINUTE, [Date]) AS MIN, COUNT(*) AS COUNT 

FROM [database].[dbo].[errorlog] 

GROUP BY DATEPART(YEAR, [Date]), DATEPART(MONTH, [Date]), DATEPART(DAY, [Date]), 
     DATEPART(HOUR, [Date]), DATEPART(MINUTE, [Date]) 

ORDER BY DATEPART(YEAR, [Date]) DESC, DATEPART(MONTH, [Date]) DESC, 
     DATEPART(DAY, [Date]) DESC, DATEPART(HOUR, [Date]) DESC, 
     DATEPART(MINUTE, [Date]) DESC; 

但你可以看到這就是很多模糊的只是爲了得到一個算的,所以我不知道有更好的方法來分組,所以我把它分成幾個分,關於年,月,日和小時?

+0

不要忘記提及您正在使用的SQL數據庫和版本。 – 2013-10-02 08:05:22

+0

Im使用MSSQL 2008 R2 – Jason94

+0

你能告訴我們你的[Date]列的數據類型是什麼? – 2013-10-02 08:57:56

回答

2

這應該將工作(你可以這樣表達,如果你想進一步減少重複進入一個子查詢):

select dateadd(second,-datepart(ss,[Date]),[Date]) as time_stamp, count(*) as count 
FROM [database].[dbo].[errorlog] 
group by dateadd(second,-datepart(ss,[Date]),[Date]) 
order by dateadd(second,-datepart(ss,[Date]),[Date]) desc ; 

第一個解決方案將時間戳記四捨五入到最接近的分鐘。我意識到這不是OP想要的。 所以,第二個解決方案只是substracts的seconds部分來自時間戳和葉秒時間戳zero(假設[日期]沒有小數秒)

+0

他們不想完全忽略時間 - 只有秒和毫秒。 –

+0

@ Damien_The_Unbeliever:我沒有關注你的評論。 http://technet.microsoft.com/en-us/library/ms182418(v=sql.100).aspx says smalldatetime「定義與一天的時間相結合的日期,時間基於24小時一天中,秒數始終爲零(:00),並且沒有小數秒。「 – 2013-10-02 08:13:52

+0

對不起,誤解了 - 我以爲你是在鑄造'日期'。 –

0
DATEADD(minute,DATEDIFF(minute,'20010101',[Date]),'20010101') 

應將所有列值降至最接近的分鐘。所以:對這個答案的意見後

select CAST([Date] AS smalldatetime) as time_stamp, count(*) as count 
FROM [database].[dbo].[errorlog] 
group by CAST([Date] AS smalldatetime) 
order by CAST([Date] AS smalldatetime) desc; 

更新:

SELECT DATEADD(minute,DATEDIFF(minute,'20010101',[Date]),'20010101'), 
    COUNT(*) AS COUNT 
FROM [database].[dbo].[errorlog] 
GROUP BY DATEADD(minute,DATEDIFF(minute,'20010101',[Date]),'20010101') 
ORDER BY DATEADD(minute,DATEDIFF(minute,'20010101',[Date]),'20010101') DESC; 

0

你可以做這樣的事情讓

declare @now datetime 
set @now = GETDATE() 

select dateadd(minute, mm, @now) as date, c from (
    select DATEDIFF(minute, @now, [Date]) as mm, COUNT(1) as c 
    from [database].[dbo].[errorlog] 
    group by DATEDIFF(minute, @now, [Date]) 
) t 
相關問題