sql >> Database >  >> RDS >> Sqlserver

Groepeer DateTime in intervallen van 5,15,30 en 60 minuten

Met behulp van

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

geeft u het aantal minuten sinds 1990-1-1 (u kunt de gewenste basisdatum gebruiken).

Dan kun je delen door 5, 15, 30 of 60 en groeperen op het resultaat van deze deling. Ik heb gecontroleerd dat het wordt geëvalueerd als een geheel getal, dus je krijgt een geheel getal dat je kunt gebruiken om te groeperen op.

d.w.z.

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

UPDATE Omdat de oorspronkelijke vraag zo is bewerkt dat de gegevens na de groepering in datum-tijd-indeling moeten worden weergegeven, heb ik deze eenvoudige vraag toegevoegd die doet wat de OP wil:

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

OPMERKING:ik heb dit voor de duidelijkheid verdeeld in 3 subquery's. Je moet het van binnenuit lezen. Het kan natuurlijk worden geschreven als een enkele, compacte query

OPMERKING:als je de periode en de startdatum-tijd verandert, kun je elk interval krijgen dat je nodig hebt, zoals weken vanaf een bepaalde dag, of wat je maar nodig hebt

Als u testgegevens voor deze zoekopdracht wilt genereren, gebruikt u dit:

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)

Het resultaat van het uitvoeren van de query is dit:

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. TEXTSIZE INSTELLEN Werkt niet in SQL Server? Controleer dit.

  2. MySQL:door komma's gescheiden lijst in meerdere rijen splitsen

  3. INITCAP() Functie in Oracle

  4. Hoe de n-de rij in een SQL-databasetabel te selecteren?