Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gruppieren Sie DateTime in Intervalle von 5, 15, 30 und 60 Minuten

Verwenden von

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

gibt Ihnen die Anzahl der Minuten seit dem 1.1.1990 (Sie können das gewünschte Basisdatum verwenden).

Dann können Sie durch 5, 15, 30 oder 60 dividieren und nach dem Ergebnis dieser Division gruppieren. Ich habe überprüft, dass es als ganzzahlige Division ausgewertet wird, sodass Sie eine ganze Zahl erhalten, nach der Sie gruppieren können.

d.h.

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

AKTUALISIEREN Da die ursprüngliche Frage so bearbeitet wurde, dass die Daten nach der Gruppierung im Datum-Uhrzeit-Format angezeigt werden müssen, habe ich diese einfache Abfrage hinzugefügt, die das tut, was das OP will:

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

HINWEIS:Ich habe dies der Übersichtlichkeit halber in 3 Unterabfragen unterteilt. Sie sollten es von innen nach außen lesen. Sie könnte natürlich auch als einzelne, kompakte Abfrage geschrieben werden

HINWEIS:Wenn Sie den Zeitraum und die Startzeit ändern, können Sie ein beliebiges Intervall erhalten, das Sie benötigen, z. B. Wochen ab einem bestimmten Tag oder was auch immer Sie benötigen

Wenn Sie Testdaten für diese Abfrage generieren möchten, verwenden Sie Folgendes:

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)

Das Ergebnis der Ausführung der Abfrage ist folgendes:

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