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.

Кто-нибудь знает, как это сделать? Я все еще могу делать это (поскольку я банкомат) динамически в моем коде, но я очищаю мусорный код, и это можно сделать через SQL, я просто не могу понять, как :(.

Более лучший подход описал в этом ответе!

webcoder 19.06.2015 11:51
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
194
1
253 516
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

Вы уверены, что второй работает? На SQL Server это не удается, и это не удается по уважительной причине. Я ожидал, что он потерпит неудачу и где-нибудь еще. Можете ли вы подтвердить, что MySQL действительно обрабатывает этот запрос?

Tomalak 14.12.2008 18:56

Я только что попробовал, работает нормально. MySQL более снисходительно относится к GROUP BY и доверяет вам написать недвусмысленный запрос.

Bill Karwin 14.12.2008 21:57

Спасибо за информацию. Я не могу решить, хорошо это или плохо, но это хорошо согласуется с моим мнением о MySQL. С технической точки зрения - как это должно работать? Я могу только представить, что синтаксический анализатор запросов заменяет псевдоним в предложении GROUP BY фактическим выражением.

Tomalak 14.12.2008 22:18

Это ловушка производительности! Имейте в виду, что использование такой функции - DATE () не позволяет вам использовать индексы для этого столбца.

Kamil Bednarz 29.10.2015 12:01

Я использовал первый, и он отлично сработал. Спасибо за этот совет

Helen Neely 20.03.2020 12:08

Или же:

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

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

Я был бы очень удивлен, если бы MySQL выполнял преобразование дважды. В операторах group by select разрешены только агрегатные функции и выражения в группе по списку. Движок уже должен знать, что эти два выражения одинаковы.

Tmdean 14.12.2008 21:46

@Tmdean, «В операторах group by select разрешены только агрегатные функции и выражения в группе по списку» - не могли бы вы объяснить это более простыми словами?

Istiaque Ahmed 11.11.2017 14:27
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

Он будет давать почасовую сумму за определенный день!

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

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

запрос не в порядке

ZJS 06.05.2015 21:22

Другие вопросы по теме