MySQL / SQL: группировка по дате только в столбце Datetime

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, я просто не могу узнать, как :(.

fmsf
источник
1
Лучший подход описан в этом ответе !
веб-кодер

Ответы:

288

Приведите дату и время к дате, затем GROUP BY, используя этот синтаксис:

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

Или вы можете GROUP BY псевдоним, как @ orlandu63 предложил:

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

Хотя я не думаю, что это повлияет на производительность, это немного яснее.

Майкл Харен
источник
1
Вы уверены, что второй работает? На SQL Server это происходит сбой, и это происходит по уважительной причине. Я ожидал бы, что это потерпит неудачу где-нибудь еще также. Можете ли вы подтвердить, что MySQL действительно обрабатывает этот запрос?
Томалак
1
Я только что попробовал, и он отлично работает. MySQL более разборчив в GROUP BY и доверяет вам написать не двусмысленный запрос.
Билл Карвин
Спасибо за информацию. Я не могу решить, хорошо это или нет, но это хорошо вписывается в мое мнение о MySQL. С технической точки зрения - как это должно работать? Я могу только представить, что анализатор запросов заменяет псевдоним в предложении GROUP BY фактическим выражением.
Томалак
17
Это ловушка производительности! Помните, что использование такой функции - DATE () не позволяет использовать индексы для этого столбца.
Камил Беднарз
Я использовал первый, и он работал как шарм. Спасибо за этот совет
Хелен Нили
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 дважды за ряд.

мычание
источник
7
Я был бы очень удивлен, если бы MySQL запустил преобразование дважды. Только агрегатные функции и выражения в группе по списку допускаются в операторах выбора группы. Движок уже должен знать, что эти два выражения одинаковы.
Tmdean
1
@Tmdean, «Только агрегатные функции и выражения в группе по списку разрешены в группе по операторам выбора» - можете ли вы объяснить это более простыми словами?
Истак Ахмед
9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

Это даст час суммой от определенного дня!

РаК Чоудары
источник