Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kelompokkan DateTime menjadi interval 5,15,30 dan 60 menit

Menggunakan

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

akan memberi Anda jumlah menit sejak 1990-1-1 (Anda dapat menggunakan tanggal dasar yang diinginkan).

Kemudian Anda dapat membagi dengan 5, 15, 30 atau 60, dan mengelompokkan dengan hasil pembagian ini. Saya telah memeriksanya akan dievaluasi sebagai pembagian bilangan bulat, sehingga Anda akan mendapatkan bilangan bulat yang dapat Anda gunakan untuk mengelompokkannya.

yaitu

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

PERBARUI Karena pertanyaan awal telah diedit untuk meminta data ditampilkan dalam format tanggal-waktu setelah pengelompokan, saya telah menambahkan kueri sederhana ini yang akan melakukan apa yang diinginkan OP:

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

CATATAN:Saya telah membagi ini dalam 3 subkueri untuk kejelasan. Anda harus membacanya dari dalam ke luar. Tentu saja dapat ditulis sebagai kueri tunggal yang ringkas

CATATAN:jika Anda mengubah periode dan tanggal-waktu mulai, Anda bisa mendapatkan interval apa pun yang Anda butuhkan, seperti minggu mulai dari hari tertentu, atau apa pun yang Anda perlukan

Jika Anda ingin menghasilkan data uji untuk kueri ini, gunakan ini:

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)

Hasil dari eksekusi query adalah sebagai berikut:

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. Cara Menjalankan Pekerjaan Agen SQL Server menggunakan T-SQL

  2. Mengonversi DateTime ke Format YYYY-MM-DD di SQL Server

  3. Cara Menggabungkan String di SQL Server dengan CONCAT()

  4. SQL Dinamis (melewati nama tabel sebagai parameter)

  5. LOG() Contoh di SQL Server