Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Nhóm DateTime thành các khoảng thời gian 5,15,30 và 60 phút

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thêm nhóm người dùng Active Directory làm đăng nhập trong SQL Server

  2. Liệt kê các truy vấn đang chạy trên SQL Server

  3. Lấy và cài đặt Microsoft SQL Server Management Studio

  4. SQL Server:kết hợp nhiều hàng thành một hàng

  5. Cách đổi tên khóa JSON trong SQL Server (T-SQL)