2

MySQL で、1 つのテーブルのデータを 1 時間ごとのバケットにカウントする良い方法は何ですか?

私はもう試した、

SELECT count(*) FROM tournament GROUP BY HOUR(date_created)

ただし、時間の数値をグルーパーとして使用しているだけなので、これは異なる日の時間をグループ化します。

ハタとして使いたいのですdate_createdが、時間の単位がなく、1 時間未満です。しかし、これを達成するためのより良い方法があるかもしれません。

助言がありますか?

4

4 に答える 4

3

DATE_FORMAT時間までのすべての重要な部分を含めるように日付の使用をフォーマットできます。

GROUP BY DATE_FORMAT(date_created, '%Y-%m-%d %H')

DATE_FORMAT文字列を返します。MySQL DateTime を取得するには、次を使用します

GROUP BY STR_TO_DATE(DATE_FORMAT(date_created, '%Y-%m-%d %H'), '%Y-%m-%d %H')
于 2013-06-04T15:13:36.550 に答える
1

日付の timetsamp を使用すると、次のことができます。

SELECT COUNT(1),TimeStampHour FROM
(
    SELECT
        FROM_UNIXTIME(UNIX_TIMESTAMP(date_created) -
        MOD(UNIX_TIMESTAMP(date_created),3600)) TimeStampHour
    FROM tournament
) A GROUP BY TimeStampHour;

または、タイムスタンプを数値としてのみ必要な場合

SELECT COUNT(1),TimeStampHour FROM
(
    SELECT
        UNIX_TIMESTAMP(date_created) -
        MOD(UNIX_TIMESTAMP(date_created),3600) TimeStampHour
    FROM tournament
) A GROUP BY TimeStampHour;

試してみる !!!

説明

3600 という数字が使われている理由は、1 時間は 3600 秒だからです。正確な時間のタイムスタンプを取得するには、タイムスタンプから削除する秒数を取得するために、タイムスタンプのモジュラスと 3600 を減算する必要があります。

これを示すサンプル コードを次に示します。

SELECT *,
    ts_now - ts_extra ts_hr,
    FROM_UNIXTIME(ts_now - ts_extra) hr
FROM
(SELECT
    NOW() now,
    UNIX_TIMESTAMP(NOW()) ts_now,
    MOD(UNIX_TIMESTAMP(NOW()),3600) ts_extra
) A;

今実行すると、これが得られます

mysql> SELECT *,
    ->     ts_now - ts_extra ts_hr,
    ->     FROM_UNIXTIME(ts_now - ts_extra) hr
    -> FROM
    -> (SELECT
    ->     NOW() now,
    ->     UNIX_TIMESTAMP(NOW()) ts_now,
    ->     MOD(UNIX_TIMESTAMP(NOW()),3600) ts_extra
    -> ) A;
+---------------------+------------+----------+------------+---------------------+
| now                 | ts_now     | ts_extra | ts_hr      | hr                  |
+---------------------+------------+----------+------------+---------------------+
| 2013-06-04 11:52:10 | 1370361130 |     3130 | 1370358000 | 2013-06-04 11:00:00 |
+---------------------+------------+----------+------------+---------------------+
1 row in set (0.00 sec)

mysql>
于 2013-06-04T15:29:24.250 に答える
1

試す:

GROUP BY YEAR(date_created), MONTH(date_created), DAY(date_created), HOUR(date_created)
于 2013-06-04T15:13:24.250 に答える
1

あなたのdate_created列は、時間、日、月(おそらく年)DATETIMEだけでよいと思いますか?GROUP BY

SELECT count(*) FROM tournament GROUP BY HOUR(date_created), DAY(date_created), MONTH(date_created)

ここで日付と時刻関数のドキュメントを確認できます

于 2013-06-04T15:13:31.933 に答える