sql >> Database teknologi >  >> RDS >> Sqlserver

Gruppér DateTime i 5,15,30 og 60 minutters intervaller

Bruger

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

vil give dig antallet af minutter siden 1990-1-1 (du kan bruge den ønskede basisdato).

Så kan du dividere med 5, 15, 30 eller 60 og gruppere efter resultatet af denne division. Jeg har tjekket, at det vil blive evalueret som en heltalsdivision, så du får et heltal, du kan bruge til at gruppere efter.

dvs.

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

OPDATERING Da det oprindelige spørgsmål blev redigeret til at kræve, at dataene skal vises i dato-tidsformat efter grupperingen, har jeg tilføjet denne enkle forespørgsel, der vil gøre, hvad OP vil have:

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

BEMÆRK:Jeg har delt dette op i 3 underforespørgsler for klarhedens skyld. Du bør læse den indefra og ud. Det kunne selvfølgelig skrives som en enkelt, kompakt forespørgsel

BEMÆRK:Hvis du ændrer perioden og startdato-tid, kan du få ethvert interval, du har brug for, f.eks. uger, der starter fra en given dag, eller hvad du nu har brug for

Hvis du vil generere testdata for denne forespørgsel, brug denne:

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 af at udføre forespørgslen er dette:

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. Sådan får du kalenderkvartal fra en dato i TSQL

  2. Sorter punkttegn i databasen

  3. Sådan opnår du PostgreSQL høj tilgængelighed med pgBouncer

  4. Er SELECT-type-forespørgsler den eneste type, der kan indlejres?