2010-10-07 77 views
3

如果您熟悉Microsoft Log Parser,您可能會認識到Quantize函數會將值截斷爲其他值的最接近倍數。將日期時間字段分組爲增量非常方便。Transact-SQL是否具有與MS Logparser Quantize類似的功能?

Date-Time    Count 
1/1/2010 00:00   100 
1/1/2010 00:15   134 
1/1/2010 00:30   56 
.... 

我試圖找到交易-SQL類似的功能(特別是SQL Server 2005或2008),這將讓我做的日期時間類似的分組。

回答

2

不是直接的,它沒有。但是你可以用一個你編寫的函數進行分組,這個函數將日期時間列四捨五入到最接近的四分之一小時(或者Quantize所做的任何事情)。

SELECT 
    dbo.QuarterHour(DateColumn) AS Date-Time 
    , COUNT(*) AS Count 
FROM MyTable 
GROUP BY dbo.QuarterHour(DateColumn) 
3

你能讓像這樣任何給定的分鐘數:

DateAdd(Minute, (DateDiff(minute, 0, getutcdate())/15) * 15, 0) 

而不是使用getutcdate()你可以用你的日期列,變量或表達式。另外,分鐘數可以是一個變量。

declare @minutesQuantize int set @minutesQuantize = 15 
DateAdd(Minute, (DateDiff(minute, 0, getutcdate())/@minutesQuantize) * @minutesQuantize, 0) 

唯一的規則是日期差異必須適合一個整數I.e.少於20億美元。這意味着如果沒有更復雜的表達式,你就無法做到幾秒或幾毫秒。

如果您需要秒鐘或毫秒做到這一點:

dateadd(ms, (datediff(ms, dateadd(day, datediff(day, 0, @date), 0), @date)/@msInterval)*@msInterval, dateadd(day, datediff(day, 0, @date), 0)) 

或者,如果你想換到一個函數是:

create function dbo.DateRoundMinutes(@dt datetime, @minutes int) 
returns datetime 
as begin 
return DateAdd(Minute, (DateDiff(minute, 0, @dt)/@minutes) * @minutes, 0) 
end 

go 
create function dbo.DateRoundMilliseconds(@dt datetime, @ms int) 
returns datetime 
as begin 
return dateadd(ms, (datediff(ms, dateadd(day, datediff(day, 0, @dt), 0), @dt)/@ms)*@ms, dateadd(day, datediff(day, 0, @dt), 0)) 
end 

您可以使用這樣的:

select t.dt, 
dbo.DateRoundMilliseconds(dt, 500) dt0_5Second, -- Half second 
dbo.DateRoundMilliseconds(dt, 5000) dt5second, -- 5 second 
dbo.DateRoundMilliseconds(dt, 15000) dt15Second, 
dbo.DateRoundMilliseconds(dt, 90000) dt90Second, 
dbo.DateRoundMinutes(dt, 2) dt2Minute, 
dbo.DateRoundMinutes(dt, 5) dt5Minute, 
dbo.DateRoundMinutes(dt, 15) dt15Minute, 
dbo.DateRoundMinutes(dt, 90) dt90Minute 
from 
     /* some table having a column dt */ 
相關問題