Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengelompokkan datetime MySQL ke dalam interval terlepas dari zona waktu

Anda dapat menggunakan TIMESTAMPDIFF untuk mengelompokkan menurut interval waktu:

Untuk interval jam tertentu, Anda dapat menggunakan:

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(HOUR, '2012-08-03 00:00:00', timestamp) / <n>) * <n> HOUR AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

Ganti kemunculan 2012-08-03 00:00:00 dengan tanggal input minimum Anda.

<n> adalah interval yang Anda tentukan dalam jam (setiap 2 jam, 3 jam, dll.), dan Anda dapat melakukan hal yang sama selama beberapa menit:

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(MINUTE, '2012-08-03 00:00:00', timestamp) / <n>) * <n> MINUTE AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

Dimana <n> adalah interval yang Anda tentukan dalam menit (setiap 45 menit, 90 menit, dll).

Pastikan Anda memasukkan tanggal input minimum Anda (dalam contoh ini 2012-08-03 00:00:00 ) sebagai parameter kedua untuk TIMESTAMPDIFF .

EDIT: Jika Anda tidak ingin khawatir tentang unit interval mana yang harus dipilih di TIMESTAMPDIFF fungsi, maka tentu saja hanya melakukan interval dengan detik (300 =5 menit, 3600 =1 jam, 7200 =2 jam, dll)

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, '2012-08-03 00:00:00', timestamp) / <n>) * <n> SECOND AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

EDIT2: Untuk mengatasi komentar Anda yang berkaitan dengan pengurangan jumlah area dalam pernyataan di mana Anda harus memasukkan tanggal parameter minimum, Anda dapat menggunakan:

SELECT   b.mindate + 
         INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, b.mindate, timestamp) / <n>) * <n> SECOND AS start_time,
         COUNT(*) AS total 
FROM     event 
JOIN     (SELECT '2012-08-03 00:00:00' AS mindate) b ON timestamp >= b.mindate
GROUP BY start_time

Dan cukup berikan parameter datetime minimum Anda sekali ke dalam subpilihan gabungan.

Anda bahkan dapat membuat kolom kedua di subpilihan gabungan untuk interval detik Anda (mis. 3600 ) dan beri nama kolom seperti secinterval ... lalu ubah <n> ke b.secinterval , jadi Anda hanya perlu memasukkan parameter tanggal minimum DAN interval masing-masing satu kali.

Demo SQLFiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolom bersyarat untuk kueri berdasarkan kolom lain di MySQL

  2. Menginstal Driver MySQL JDBC di Integrasi Data Pentaho dan alat BA Server

  3. Hapus sejumlah besar data dari tabel besar

  4. Cara mengatur Path variabel lingkungan menggunakan C #

  5. Prosedur tersimpan MySQL atau kode php?