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
....

Transaction-SQL(具体的にはSQL Server 2005または2008)で、日時に同様のグループ化を実行できる同様の関数を見つけようとしています。

4

2 に答える 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 */
于 2016-02-02T11:43:20.987 に答える
3

直接ではなく、そうではありません。ただし、日時列を最も近い15分(またはQuantizeが行うもの)に丸める関数(作成した関数)でグループ化することはできます。

SELECT
    dbo.QuarterHour(DateColumn) AS Date-Time
  , COUNT(*) AS Count
FROM MyTable
GROUP BY dbo.QuarterHour(DateColumn)
于 2010-10-07T01:53:56.067 に答える