MySQL / SQL: Kelompokkan menurut tanggal hanya pada kolom Datetime

182

Memiliki meja dengan kolom seperti: mydate DATETIME...

Saya punya pertanyaan seperti:

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

Ini akan dikelompokkan berdasarkan penuh datetime, termasuk jam dan menit. Saya ingin membuat grup dengan, hanya dengan tanggal YYYY/MM/DDbukan oleh YYYY/MM/DD/HH/mm.

Adakah yang tahu bagaimana melakukan ini? Saya masih bisa melakukannya (seperti saya atm), secara dinamis dalam kode saya, tapi saya sedang membersihkan kode tempat sampah dan ini dapat dilakukan melalui SQL Saya tidak bisa mengetahui caranya :(.

fmsf
sumber
1
Pendekatan yang lebih baik dijelaskan dalam jawaban ini !
webcoder

Jawaban:

287

Keluarkan datetime ke tanggal, lalu GROUP BY menggunakan sintaks ini:

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

Atau Anda bisa KELOMPOK OLEH alias sebagai @ orlandu63 disarankan:

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

Meskipun saya tidak berpikir itu akan membuat perbedaan pada kinerja, itu sedikit lebih jelas.

Michael Haren
sumber
1
Apakah Anda yakin yang kedua berfungsi? Pada SQL Server, ini gagal, dan gagal karena alasan yang baik. Saya akan berharap itu gagal di tempat lain juga. Bisakah Anda mengonfirmasi bahwa MySQL benar-benar menangani permintaan ini?
Tomalak
1
Saya baru saja mencobanya dan berfungsi dengan baik. MySQL lebih permisif tentang GROUP BY dan mempercayai Anda untuk menulis kueri yang tidak ambigu.
Bill Karwin
Terimakasih atas infonya. Saya tidak bisa memutuskan apakah ini hal yang baik atau tidak, tetapi cocok dengan pendapat saya tentang MySQL. Dari POV teknis - bagaimana ini seharusnya bekerja? Saya hanya bisa membayangkan bahwa parser kueri menggantikan alias dalam klausa GROUP BY dengan ekspresi aktual.
Tomalak
17
Ini jebakan kinerja! Ingatlah bahwa menggunakan fungsi seperti itu - DATE () tidak memungkinkan Anda untuk meningkatkan indeks pada kolom ini.
Kamil Bednarz
Saya menggunakan yang pertama dan itu bekerja seperti pesona. Terima kasih atas tip ini
Helen Neely
20

Saya menemukan bahwa saya perlu mengelompokkan berdasarkan bulan dan tahun sehingga tidak satu pun di atas bekerja untuk saya. Sebagai gantinya saya menggunakan date_format

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 
Richard Merchant
sumber
2
permintaan rusak
ZJS
19

Atau:

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

Lebih efisien (saya pikir.) Karena Anda tidak perlu membuang tanggal saya dua kali per baris.

melenguh
sumber
7
Saya akan sangat terkejut jika MySQL menjalankan konversi dua kali. Hanya fungsi agregat dan ekspresi dalam grup berdasarkan daftar yang diizinkan dalam grup dengan pernyataan pilihan. Mesin sudah harus tahu bahwa kedua ekspresi itu sama.
Tmdean
1
@Tmdean, 'Hanya fungsi agregat dan ekspresi dalam grup dengan daftar diizinkan dalam grup dengan pernyataan pilihan' - dapatkah Anda menjelaskannya dengan kata-kata yang lebih mudah?
Istiaque Ahmed
9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

Ini akan memberi jam dengan jumlah dari hari tertentu!

RaK Chowdary
sumber