sql >> Databasteknik >  >> RDS >> Sqlserver

Gruppera DateTime i 5,15,30 och 60 minuters intervall

Använder

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

ger dig antalet minuter sedan 1990-1-1 (du kan använda önskat basdatum).

Sedan kan du dividera med 5, 15, 30 eller 60 och gruppera efter resultatet av den här divisionen. Jag har kontrollerat att det kommer att utvärderas som en heltalsdivision, så du får ett heltal som du kan använda för att gruppera efter.

dvs.

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

UPPDATERA Eftersom den ursprungliga frågan redigerades för att kräva att data ska visas i datum-tid-format efter grupperingen, har jag lagt till denna enkla fråga som kommer att göra vad OP vill:

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

OBS:Jag har delat upp detta i 3 underfrågor för tydlighetens skull. Du bör läsa den inifrån och ut. Det kan naturligtvis skrivas som en enda, kompakt fråga

OBS:om du ändrar perioden och startdatum-tid kan du få vilket intervall du behöver, som veckor som börjar från en viss dag, eller vad du kan behöva

Om du vill generera testdata för den här frågan använd detta:

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)

Resultatet av att köra frågan är detta:

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


  1. Neo4j - Skapa en begränsning med Cypher

  2. Oracle PLSQL-blockstruktur och -typer

  3. Hur man lägger till en separator till en sammanfogad sträng i MySQL – CONCAT_WS()

  4. Hur jämför man data mellan två databaser i PostgreSQL?