Sử dụng
datediff(minute, '1990-01-01T00:00:00', yourDatetime)
sẽ cung cấp cho bạn số phút kể từ năm 1990-1-1 (bạn có thể sử dụng ngày cơ sở mong muốn).
Sau đó, bạn có thể chia cho 5, 15, 30 hoặc 60 và nhóm theo kết quả của phép chia này.
tức là
group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5
CẬP NHẬT Vì câu hỏi ban đầu đã được chỉnh sửa để yêu cầu dữ liệu được hiển thị ở định dạng ngày-giờ sau khi nhóm, tôi đã thêm truy vấn đơn giản này sẽ thực hiện những gì OP muốn:
-- 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
LƯU Ý:Tôi đã chia điều này thành 3 truy vấn phụ để rõ ràng. Bạn nên đọc nó từ trong ra ngoài. Tất nhiên, nó có thể được viết dưới dạng một truy vấn nhỏ gọn, đơn lẻ
LƯU Ý:nếu bạn thay đổi khoảng thời gian và ngày-giờ bắt đầu, bạn có thể nhận được bất kỳ khoảng thời gian nào bạn cần, chẳng hạn như các tuần bắt đầu từ một ngày nhất định hoặc bất kỳ khoảng thời gian nào bạn có thể cần
Nếu bạn muốn tạo dữ liệu thử nghiệm cho truy vấn này, hãy sử dụng cái này:
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)
Kết quả của việc thực hiện truy vấn là:
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