TIMESTAMPDIFF
時間間隔でグループ化するには:
指定された時間間隔で、次を使用できます:
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
2012-08-03 00:00:00
のオカレンスを置き換えます 最小入力日で。
<n>
時間で指定した間隔です (すべての2
時間、3
時間など)、数分間同じことを行うことができます:
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
<n>
の場所 分で指定した間隔です (45
ごと 分、90
分など)。
最小入力日(この例では2012-08-03 00:00:00
)を渡していることを確認してください )TIMESTAMPDIFF
の2番目のパラメータとして 。
編集: TIMESTAMPDIFF
で選択する間隔単位について心配したくない場合 関数、そしてもちろん秒単位の間隔を実行します(300 =5分、3600 =1時間、7200 =2時間など)
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: 最小パラメーター日付を渡す必要があるステートメント内の領域の数を減らすことに関するコメントに対処するには、次を使用できます。
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
そして、最小日時パラメータを結合副選択に1回渡すだけです。
秒間隔で結合副選択に2番目の列を作成することもできます(例:3600
)列にsecinterval
のような名前を付けます ...次に<n>
を変更します のb.secinterval
、したがって、最小の日付パラメータと間隔を1回ずつ渡すだけで済みます。