2010-10-07 18 views
3

Si vous connaissez Microsoft Log Parser, vous reconnaissez probablement la fonction Quantize qui tronquera une valeur au multiple le plus proche d'une autre valeur. C'est très pratique pour regrouper les champs de date-heure en incréments.Est-ce que Transact-SQL a une fonction similaire à MS Logparser Quantize?

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

Je suis en train de trouver une fonction similaire dans Transaction-SQL (spécifiquement SQL Server 2005 ou 2008) qui me permettra de faire un regroupement similaire à la date du temps.

Répondre

2

Pas directement, ce n'est pas le cas. Mais vous pouvez grouper par une fonction (que vous écrivez) qui arrondit la colonne datetime à son quart d'heure le plus proche (ou à tout ce que fait Quantize).

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

Vous pouvez arrondir à un nombre donné de minutes comme ceci:

DateAdd(Minute, (DateDiff(minute, 0, getutcdate())/15) * 15, 0) 

Au lieu d'utiliser getutcdate() vous pouvez utiliser votre colonne de date, variable ou expression. De plus le nombre de minutes peut être une variable.

declare @minutesQuantize int set @minutesQuantize = 15 
DateAdd(Minute, (DateDiff(minute, 0, getutcdate())/@minutesQuantize) * @minutesQuantize, 0) 

La seule règle est que la différence de date doit tenir dans un nombre entier, par ex. être inférieur à 2 milliards. Cela signifie que vous ne pouvez pas faire des secondes ou des millisecondes sans une expression plus compliquée.

Si vous avez besoin secondes ou millisecondes font:

dateadd(ms, (datediff(ms, dateadd(day, datediff(day, 0, @date), 0), @date)/@msInterval)*@msInterval, dateadd(day, datediff(day, 0, @date), 0)) 

Ou, si vous voulez envelopper cela en fonction:

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 

que vous pouvez utiliser comme ceci:

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