2010-10-07 74 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 */ 
相关问题