Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Groupe DateTime en intervalles de 5, 15, 30 et 60 minutes

Utiliser

datediff(minute, '1990-01-01T00:00:00', yourDatetime)

vous donnera le nombre de minutes depuis le 1990-1-1 (vous pouvez utiliser la date de base souhaitée).

Ensuite, vous pouvez diviser par 5, 15, 30 ou 60 et regrouper par le résultat de cette division. J'ai vérifié qu'il sera évalué comme une division entière, vous obtiendrez donc un nombre entier que vous pourrez utiliser pour regrouper.

c'est-à-dire

group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5

MISE À JOUR Comme la question d'origine a été modifiée pour exiger que les données soient affichées au format date-heure après le regroupement, j'ai ajouté cette requête simple qui fera ce que veut l'OP :

-- This convert the period to date-time format
SELECT 
    -- note the 5, the "minute", and the starting point to convert the 
    -- period back to original time
    DATEADD(minute, AP.FiveMinutesPeriod * 5, '2010-01-01T00:00:00') AS Period,
    AP.AvgValue
FROM
    -- this groups by the period and gets the average
    (SELECT
        P.FiveMinutesPeriod,
        AVG(P.Value) AS AvgValue
    FROM
        -- This calculates the period (five minutes in this instance)
        (SELECT 
            -- note the division by 5 and the "minute" to build the 5 minute periods
            -- the '2010-01-01T00:00:00' is the starting point for the periods
            datediff(minute, '2010-01-01T00:00:00', T.Time)/5 AS FiveMinutesPeriod,
            T.Value
        FROM Test T) AS P
    GROUP BY P.FiveMinutesPeriod) AP

REMARQUE :J'ai divisé cela en 3 sous-requêtes pour plus de clarté. Vous devriez le lire de l'intérieur. Elle pourrait, bien sûr, être écrite sous la forme d'une requête unique et compacte

REMARQUE :si vous modifiez la période et la date-heure de début, vous pouvez obtenir l'intervalle dont vous avez besoin, comme des semaines à partir d'un jour donné, ou tout ce dont vous avez besoin

Si vous souhaitez générer des données de test pour cette requête, utilisez ceci :

CREATE TABLE Test
( Id INT IDENTITY PRIMARY KEY,
Time DATETIME,
Value FLOAT)

INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:00:22', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:03:22', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:04:45', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:07:21', 20)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:10:25', 30)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:11:22', 30)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:14:47', 30)

Le résultat de l'exécution de la requête est le suivant :

Period                     AvgValue
2012-03-22 00:00:00.000    10
2012-03-22 00:05:00.000    20
2012-03-22 00:10:00.000    30