MySQL / SQL: Tarihe göre yalnızca bir Datetime sütununda gruplandır


182

Şuna benzer bir sütuna sahip bir tablo olması: mydate DATETIME...

Ben gibi bir sorgu var:

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

Bu datetimesaatler ve dakikalar dahil olmak üzere tam olarak gruplandırılacaktır . Sadece tarihe göre, göre grup yapmak isteyen YYYY/MM/DDvermeyerek YYYY/MM/DD/HH/mm.

Bunu nasıl yapacağını bilen var mı? Hala (atm olduğum gibi), benim kod dinamik olarak yapabilirim, ama çöp kodunu temizliyorum ve bu SQL üzerinden yapılabilir ben sadece nasıl bulamazsınız :(.


1
Bu cevapta açıklanan daha iyi bir yaklaşım !
webcoder

Yanıtlar:


288

Tarih saatini bir tarihe yayınlayın, ardından bu sözdizimini kullanarak GROUP BY:

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

Veya @ orlandu63 tarafından önerildiği gibi takma adı GÖRE GRUPLA:

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

Performansta herhangi bir fark yaratacağını düşünmese de, biraz daha açık.


1
İkincisinin çalıştığından emin misiniz? SQL Server'da bu başarısız olur ve iyi bir nedenden dolayı başarısız olur. Ben başka bir yerde başarısız olmasını beklenir. MySQL'in bu sorguyu gerçekten ele aldığını doğrulayabilir misiniz?
Tomalak

1
Sadece denedim ve iyi çalışıyor. MySQL, GROUP BY hakkında daha izinlidir ve belirsiz olmayan bir sorgu yazmanıza güvenir.
Bill Karwin

Bilgi için teşekkürler. Bunun iyi bir şey olup olmadığına karar veremiyorum, ancak MySQL hakkındaki görüşüme iyi uyuyor. Teknik bir POV'dan - bunun nasıl çalışması gerekiyor? Yalnızca sorgu ayrıştırıcısı GROUP BY yan tümcesindeki diğer adı gerçek ifade ile değiştirebilir düşünebilirsiniz.
Tomalak

17
Bu bir performans tuzağı! Böyle bir işlev kullanmanın DATE () işlevinin bu sütundaki dizinlerden yararlanmanıza izin vermediğini unutmayın.
Kamil Bednarz

İlkini kullandım ve bir cazibe gibi çalıştı. Bu ipucu için teşekkürler
Helen Neely

20

Ay ve yıla göre gruplandırmam gerektiğini buldum, bu yüzden yukarıdakilerin hiçbiri benim için çalışmadı. Bunun yerine date_format kullandım

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

2
sorgu bozuk
ZJS

19

Veya:

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

Daha verimli (sanırım.) Çünkü satır başına iki kez döküm yapmak zorunda değilsiniz.


7
MySQL dönüşümü iki kez çalıştırırsa çok şaşırırdım. Yalnızca gruplama listesindeki toplama işlevlerine ve ifadelerine grup halinde select deyimlerine izin verilir. Motor zaten iki ifadenin aynı olduğunu bilmelidir.
Tmdean

1
@Tmdean, 'Yalnızca gruba göre gruplandırma işlevlerine ve ifadelerine belirli ifadelerle grup halinde izin verilir' - daha kolay kelimelerle açıklayabilir misiniz?
Istiaque Ahmed

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

Saati belirli bir günden toplamı verecektir!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.