MySQL / SQL:日時列でのみ日付でグループ化


182

次のような列を持つテーブルを持っている:mydate DATETIME...

私は次のようなクエリを持っています:

SELECT SUM(foo), mydate FROM a_table GROUP BY a_table.mydate;

これはdatetime、時間と分を含む完全なでグループ化されます。私は、日付によって、でグループを作ることを望むYYYY/MM/DDありませんでYYYY/MM/DD/HH/mm

誰でもこれを行う方法を知っていますか?私はコード内で動的に(atmなので)まだ実行できますが、ゴミ箱のコードをクリーンアップしています。これはSQLを使用して行うことができます。方法はわかりません:(。


1
この回答で説明されているより良いアプローチ!
webcoder、2015年

回答:


287

日時を日付にキャストし、次の構文を使用してGROUP BYを実行します。

SELECT SUM(foo), DATE(mydate) FROM a_table GROUP BY DATE(a_table.mydate);

または、@ orlandu63が提案するように、エイリアスでGROUP BYすることもできます。

SELECT SUM(foo), DATE(mydate) DateOnly FROM a_table GROUP BY DateOnly;

パフォーマンスに影響はないと思いますが、もう少し明確です。


1
2つ目は問題なく機能しますか?SQL Serverでは、これは失敗しますが、それには十分な理由があります。他の場所でも失敗することを期待しています。MySQLがこのクエリを実際に処理していることを確認できますか?
Tomalak 2008

1
私はそれを試したところ、うまくいきました。MySQLはGROUP BYについてより寛容であり、あいまいでないクエリを書くことを信頼します。
ビルカーウィン

情報をありがとう。これが良いことかどうかは判断できませんが、MySQLについての私の意見にはよく合います。技術的な視点から-これはどのように機能するはずですか?クエリパーサーがGROUP BY句のエイリアスを実際の式に置き換えるだけだと想像できます。
Tomalak 2008

17
それはパフォーマンスの罠です!このような関数-DATE()を使用すると、この列のインデックスを利用できないことに注意してください。
Kamil Bednarz、2015年

私は最初のものを使いました、そしてそれは魅力のように働きました。このヒントをありがとう
ヘレンニーリー

20

月と年でグループ化する必要があるため、上記のいずれも機能しませんでした。代わりに、date_formatを使用しました

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 

2
クエリが順不同
ZJS

19

または:

SELECT SUM(foo), DATE(mydate) mydate FROM a_table GROUP BY mydate;

より効率的だと思います(行ごとにmydateを2回キャストする必要がないため)。


7
MySQLが変換を2回実行した場合、私は非常に驚きます。group by selectステートメントでは、group byリストの集計関数と式のみが許可されます。エンジンは、2つの式が同じであることをすでに知っている必要があります。
Tmdean 2008

1
@Tmdean、「グループ化リスト内の集計関数と式のみがグループ化選択ステートメントで許可されています」-簡単な言葉で説明できますか?
Istiaque Ahmed 2017

9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

特定の日からの合計で時間を与えます!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.