Имея таблицу со столбцом вроде: mydate DATETIME ...
У меня есть такой запрос:
SELECT SUM(foo), mydate FROM a_table GROUP BY a_table.mydate;
Это будет сгруппировано по полному datetime, включая часы и минуты. Я хочу сделать группу только по дате YYYY/MM/DD, а не по YYYY/MM/DD/HH/mm.
Кто-нибудь знает, как это сделать? Я все еще могу делать это (поскольку я банкомат) динамически в моем коде, но я очищаю мусорный код, и это можно сделать через SQL, я просто не могу понять, как :(.


Приведите 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 действительно обрабатывает этот запрос?
Я только что попробовал, работает нормально. MySQL более снисходительно относится к GROUP BY и доверяет вам написать недвусмысленный запрос.
Спасибо за информацию. Я не могу решить, хорошо это или плохо, но это хорошо согласуется с моим мнением о MySQL. С технической точки зрения - как это должно работать? Я могу только представить, что синтаксический анализатор запросов заменяет псевдоним в предложении GROUP BY фактическим выражением.
Это ловушка производительности! Имейте в виду, что использование такой функции - DATE () не позволяет вам использовать индексы для этого столбца.
Я использовал первый, и он отлично сработал. Спасибо за этот совет
Или же:
SELECT SUM(foo), DATE(mydate) mydate FROM a_table GROUP BY mydate;
Более эффективно (я думаю), потому что вам не нужно приводить mydate дважды для каждой строки.
Я был бы очень удивлен, если бы MySQL выполнял преобразование дважды. В операторах group by select разрешены только агрегатные функции и выражения в группе по списку. Движок уже должен знать, что эти два выражения одинаковы.
@Tmdean, «В операторах group by select разрешены только агрегатные функции и выражения в группе по списку» - не могли бы вы объяснить это более простыми словами?
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
запрос не в порядке
Более лучший подход описал в этом ответе!