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