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.