Transact-SQL是否具有与MS Logparser Quantize类似的功能?

时间:2010-10-07 01:43:59

标签: sql sql-server logparser

如果您熟悉Microsoft Log Parser,则可能会识别量化功能,该功能会将值截断为另一个值的最接近倍数。将日期时间字段分组为增量非常方便。

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

我正在尝试在Transaction-SQL(特别是SQL Server 2005或2008)中找到类似的功能,这将允许我在日期时间进行类似的分组。

2 个答案:

答案 0 :(得分:4)

你可以像这样四舍五入到任何给定的分钟数:

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)

唯一的规则是日期差异必须符合整数,即。不到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 */

答案 1 :(得分:3)

不是直接的,它没有。但是你可以按照一个函数(你写的)将日期时间列舍入到最接近的四分之一小时(或者任何量化)。

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