sql >> Databáze >  >> RDS >> Sqlserver

Seskupte datum a čas do 5, 15, 30 a 60 minutových intervalů

Pomocí

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

vám poskytne počet minut od roku 1990-1-1 (můžete použít požadované základní datum).

Pak můžete dělit 5, 15, 30 nebo 60 a seskupit podle výsledku tohoto dělení. Zkontroloval jsem, že to bude vyhodnoceno jako celočíselné dělení, takže dostanete celé číslo, podle kterého můžete seskupit.

tj.

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

AKTUALIZACE Protože původní otázka byla upravena tak, aby vyžadovala, aby se data po seskupení zobrazovala ve formátu datum-čas, přidal jsem tento jednoduchý dotaz, který udělá to, co OP chce:

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

POZNÁMKA:Pro přehlednost jsem to rozdělil do 3 dílčích dotazů. Měli byste si to přečíst zevnitř. Dalo by se to samozřejmě napsat jako jeden kompaktní dotaz

POZNÁMKA:Pokud změníte období a počáteční datum a čas, můžete získat libovolný interval, který potřebujete, například týdny počínaje daným dnem nebo cokoli jiného, ​​co potřebujete

Pokud chcete pro tento dotaz vygenerovat testovací data, použijte toto:

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)

Výsledek provedení dotazu je tento:

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. Jak formátovat datum v T-SQL

  2. Kontingenční tabulka s nekardinálními hodnotami

  3. Jak vypsat všechny databáze pomocí PostgreSQL

  4. Opravte poškozenou databázi SQL během problému s upgradem