如果您熟悉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)中找到类似的功能,这将允许我在日期时间进行类似的分组。
答案 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)