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

4
如果您熟悉Microsoft Log Parser,您可能会认识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个回答

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 */

3

直接来说,不行。但是你可以按照一个函数(由你编写)进行分组,该函数将日期时间列四舍五入到最近的15分钟(或者其他Quantize所做的内容)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接