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 :(.


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.


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 

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.


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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.