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.

Хтось знає, як це зробити? Я все ще можу це зробити (як я є атм), динамічно в коді, але я очищую код сміття, і це можна зробити через SQL, я просто не можу дізнатися, як :(


1
Кращий підхід, описаний у цій відповіді !
кодер

Відповіді:


287

Передайте дату даті, а потім GROUP BY, використовуючи цей синтаксис:

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

Або ви можете згрупувати псевдонім, як запропонував @ orlandu63:

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

Хоча я не думаю, що це не матиме ніякого значення для продуктивності, це трохи зрозуміліше.


1
Ви впевнені, що другий працює? На SQL Server це виходить з ладу, і він не працює з поважної причини. Я б очікував, що він також не вдасться ніде. Чи можете ви підтвердити, що MySQL насправді обробляє цей запит?
Томалак

1
Я просто спробував це, і він прекрасно працює MySQL більш дозволений щодо GROUP BY і довіряє вам написати запит, який не є неоднозначним.
Білл Карвін

Дякуємо за інформацію. Я не можу вирішити, добре це чи ні, але це добре вписується в мою думку про MySQL. З технічної POV - як це має працювати? Я можу лише уявити, що аналізатор запитів підміняє псевдонім у пункті 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;

Ефективніше (думаю). Тому, що вам не доведеться видавати дані мого дня два рази в ряд.


7
Я був би дуже здивований, якби MySQL провів перетворення двічі. У групі за допомогою виділених висловлювань допускаються лише сукупні функції та вирази в групі за списком. Двигун вже повинен знати, що два вирази однакові.
Tmdean

1
@Tmdean, "Лише сукупні функції та вирази в групі за списком дозволені в групі шляхом вибору операторів" - чи можете ви пояснити це простішими словами?
Істіаке Ахмед

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

Це дасть годину за сумою від конкретного дня!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.