質問

それは私がように、私はTIMESTAMPフィールドを持つ、今年のように決められた期間中、月や日を持っているレコードの数をカウントする単純なクエリを作ることは可能です

SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR

あるいは

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

月次統計を持っています。

ありがとうございます。

役に立ちましたか?

解決

GROUP BY YEAR(record_date), MONTH(record_date)

の日付と時刻をチェック関数は、MySQLでを。

他のヒント

GROUP BY DATE_FORMAT(record_date, '%Y%m')
<時間>

(主に、潜在的なdownvotersまで)。現在、これは他の提案ほど効率的ではないかもしれません。それでも、私は他のソリューションがどのように速く見に仕えることができる、あまりにも、代替としてそれを残して、1。時間が経つにつれて、この解決策になるように(あなたは違いが表示されるまで、あなたが本当に速い遅いから言うことができないため。)また、変更がいくつか(おそらく、ないそうで、最適化に関してはMySQLのエンジンを作ることができます将来的に遠い)ポイント、他のほとんどの効率にかなり匹敵しになるために。

私は誰もがそれを修正していないが、私は間違っていたので、私はその正しいと思ったが、上記の「WHERE」ステートメントを使用してみました。

:いくつかの検索の後に私は、コードは次のようになるように、これはWHERE文の右式であることが判明しました
SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)

これを試してみてください
SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

EXTRACT(単位日から)の機能以下のグループが使用され、関数は数値を返すように良好である。

グループ比較条件は、(文字列値を返す)DATE_FORMAT関数より速くなります。 SQLの比較条件のための非文字列値を返すフィールド(、、ORDER BY、GROUP BYをHAVING)

|機能を使用してみてください。

あなたの検索は数年を超えている、とあなたはまだ、毎月のグループにしたい場合は、私がお勧めします:

バージョン#1:

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY DATE_FORMAT(record_date, '%Y%m')

バージョン#2 の(より効率的な)の

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY YEAR(record_date)*100 + MONTH(record_date)

私は(の)、 そして第二版は、より良い結果を持っているように見えます。

バージョン1 の(10回の実行の平均)の:1.404秒
バージョン2 の(10回の実行の平均)の:0.780秒

SQL_NO_CACHEキーがクエリにCACHINGからMySQLを防止するために添加した。)

あなたは、MySQLで日付でグループ化したい場合は、使用して以下のコード:

 SELECT COUNT(id)
 FROM stats
 GROUP BY DAYOFMONTH(record_date)

がこのスレッドを発見しようとしているもののためにいくつかの時間を節約できます願っています。

あなたが(例えば2000)特定の年のレコードをフィルタリングする場合は、このようなWHERE句を最適化します:

SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- average 0.016 sec.

の代わりに:

WHERE YEAR(date_column) = 2000
-- average 0.132 sec.

の結果が日付カラム上300K行およびインデックスを含むテーブルに対して生成された。

GROUP BY句として、Iは、上述したテーブルに対して3つのバリアントをテスト。ここでの結果は次のとおりです:

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- average 0.203 sec.

最後のものが勝者です。

同様に、現在アクティブまだ短く、より柔軟な別の実行と

完全かつ簡単な解決策:

SELECT COUNT(*) FROM stats
-- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date)
GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d')

あなたは、最新の月が注文した各年の月ごとの行数と毎月の統計情報を取得したい場合は、これを試してください:

SELECT count(id),
      YEAR(record_date),
      MONTH(record_date) 
FROM `table` 
GROUP BY YEAR(record_date),
        MONTH(record_date) 
ORDER BY YEAR(record_date) DESC,
        MONTH(record_date) DESC

あなたは、単にMySQLの<のhref = "http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format" のrel = "noreferrerこれを行うことができますGROUP BYで「> DATE_FORMAT()の関数。その後、同じ月が異なるyears.Hereにあなたがこれをカスタマイズすることができますので、多くのオプションを発生し、このような記録は、数年に及ぶ場合など、いくつかのケースで追加明確にするため、余分な列を追加することもできます。開始beforこれをお読みください。それはあなたのために非常に有用でなければなりません願っています。ここにご理解のためのサンプルクエリがある

SELECT
    COUNT(id),
    DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY,
    DATE_FORMAT(record_date, '%Y-%m') AS MONTH,
    DATE_FORMAT(record_date, '%Y') AS YEAR,

FROM
    stats
WHERE
    YEAR = 2009
GROUP BY
    DATE_FORMAT(record_date, '%Y-%m-%d ');

次のクエリは、Oracle Database 12cをリリース12.1.0.1.0に私のために働いた。

SELECT COUNT(*)
FROM stats
GROUP BY 
extract(MONTH FROM TIMESTAMP),
extract(MONTH FROM TIMESTAMP),
extract(YEAR  FROM TIMESTAMP);

私はそうのような1年のグループの選択を最適化することを好みます

SELECT COUNT(*)
  FROM stats
 WHERE record_date >= :year 
   AND record_date <  :year + INTERVAL 1 YEAR;
あなたは一度だけで年にバインドすることができます。

この方法で、例えば'2009'、名前付きパラメータを持つと'-01-01'を追加したり、別途'2010'に渡す心配する必要はありません。

また、idことはありません、おそらく我々だけでカウントされ、行とNULLとして、私はCOUNT(*)するCOUNT(id)好むます。

.... group by to_char(date, 'YYYY') - > 1989

.... group by to_char(date,'MM') - > 05

.... group by to_char(date,'DD') ---> 23

.... group by to_char(date,'MON') ---> MAY

.... group by to_char(date,'YY') ---> 89

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top