sql >> データベース >  >> RDS >> Mysql

タイムゾーンに関係なく、MySQLの日時を間隔にグループ化する

    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回ずつ渡すだけで済みます。

    SQLFiddleデモ



    1. DELETEステートメントでエイリアスを使用できないのはなぜですか?

    2. MySQLクエリエラー-自動コイン追加

    3. PostgreSQLエラー:関数to_tsvector(文字が変化します、不明)が存在しません

    4. ローカルホストに接続できませんが、SQLServer2008ではコンピューター名を使用できます