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

标签 sql sql-server logparser

如果您熟悉 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
....

我试图在 Transaction-SQL(特别是 SQL Server 2005 或 2008)中找到类似的函数,它允许我对日期时间进行类似的分组。

最佳答案

您可以四舍五入到任何给定的分钟数,如下所示:

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

关于sql - Transact-SQL 是否具有与 MS Logparser Quantize 类似的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3878138/

相关文章:

Powershell 和 logparser 参数

LogParser 获取上一小时的结果

Powershell/Logparsing 转换数据类型

mysql - 内部连接后记录消失

sql - 没有 WHERE 子句的 SELECT NOT NULL 值

mysql - 使用大型表的现有行填充 mysql 中新列的数据

sql-server - %% 与 CONTAINSTABLE

c# - 如何获取 sql 结果并在标题中填充标签?

sql - 如何删除SQL Server中的大量数据而不丢失数据?

sql - 如何正确应用递归CTE?