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

Имея таблицу с колонкой вроде: 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, я просто не могу узнать, как :(.

14.12.2008 14:47:19
Лучший подход описан в этом ответе !
webcoder 19.06.2015 08:51:07
4 ОТВЕТА
РЕШЕНИЕ

Приведите дату и время к дате, затем 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;

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

281
15.07.2015 12:49:32
Вы уверены, что второй работает? На SQL Server это происходит сбой, и это происходит по уважительной причине. Я ожидал бы, что это потерпит неудачу где-нибудь еще также. Можете ли вы подтвердить, что MySQL действительно обрабатывает этот запрос?
Tomalak 14.12.2008 15:56:36
Я только что попробовал, и он отлично работает. MySQL более относится к GROUP BY и доверяет вам написать не двусмысленный запрос.
Bill Karwin 14.12.2008 18:57:22
Спасибо за информацию. Я не могу решить, хорошо это или нет, но это хорошо вписывается в мое мнение о MySQL. С технической точки зрения - как это должно работать? Я могу только представить, что анализатор запросов заменяет псевдоним в предложении GROUP BY фактическим выражением.
Tomalak 14.12.2008 19:18:22
Это ловушка производительности! Помните, что использование такой функции - DATE () не позволяет использовать индексы для этого столбца.
Kamil Bednarz 29.10.2015 09:01:13
Я использовал первый, и он работал как шарм. Спасибо за этот совет
Helen Neely 20.03.2020 09:08:45

Или:

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

Более эффективный (я думаю.) Потому что вам не нужно разыгрывать mydate дважды за ряд.

18
14.12.2008 15:25:02
Я был бы очень удивлен, если бы MySQL запустил преобразование дважды. Только агрегатные функции и выражения в группе по списку разрешены в группе по операторам выбора. Движок уже должен знать, что эти два выражения одинаковы.
Tmdean 14.12.2008 18:46:43
@Tmdean, «Только агрегированные функции и выражения в группе по списку допускаются в операторах выбора группы» - можете ли вы объяснить это более простыми словами?
Istiaque Ahmed 11.11.2017 11:27:07
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

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

9
31.07.2011 13:26:12

Я обнаружил, что мне нужно сгруппироваться по месяцам и годам, поэтому ни одно из вышеперечисленного не помогло мне. Вместо этого я использовал date_format

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 
18
16.08.2016 15:36:20
запрос вышел из строя
ZJS 6.05.2015 18:22:46