MySQL Запрос: Группировка по Дню / Месяцу / Году
Можно ли составить простой запрос для подсчета количества записей за определенный период времени, например, год, месяц или день, используя поле типа TIMESTAMP
? Например, такой запрос:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
Или даже:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
Чтобы получить статистику по месяцам.
Спасибо!
5 ответ(ов)
Вопрос: Как можно сгруппировать записи по месяцам в MySQL?
Ответ: Вы можете использовать функцию DATE_FORMAT
, чтобы сгруппировать записи по месяцам. Вот пример запроса:
GROUP BY DATE_FORMAT(record_date, '%Y%m')
Этот код сгруппирует записи по годам и месяцам, где %Y
представляет собой полный год, а %m
— месяц. Использование такого формата может быть удобным для анализа данных по месяцам.
Примечание (в основном, для потенциальных негативных голосующих). В настоящее время этот подход может быть не таким эффективным, как другие предложения. Тем не менее, я оставляю его в качестве альтернативы, которая также может помочь увидеть, насколько быстрее другие решения. (Вы действительно не можете определить скорость, пока не увидите разницу.) Кроме того, со временем могут быть внесены изменения в движок MySQL относительно оптимизации, что может сделать данное решение в каком-то (возможно, не столь далеком) будущем вполне сопоставимым по эффективности с большинством других.
Я пытался использовать оператор 'WHERE' в своем запросе, думал, что все правильно, так как никто не исправлял его. Но я ошибался. После некоторых поисков я обнаружил, что правильный вариант для оператора WHERE выглядит следующим образом. Так что код становится таким:
SELECT COUNT(id)
FROM stats
WHERE YEAR(record_date) = 2009
GROUP BY MONTH(record_date)
Если вам нужно фильтровать записи за конкретный год (например, 2000), оптимизируйте условие WHERE
следующим образом:
SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- среднее 0.016 сек.
Вместо этого:
WHERE YEAR(date_column) = 2000
-- среднее 0.132 сек.
Результаты были получены на таблице, содержащей 300k записей, с индексом на столбце даты.
Что касается оператора GROUP BY
, я протестировал три варианта по сравнению с вышеупомянутой таблицей; вот результаты:
SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- среднее 0.250 сек.
SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- среднее 0.468 сек.
SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- среднее 0.203 сек.
Последний вариант оказался самым быстрым.
Если вам нужно сгруппировать данные по дате в MySQL, используйте следующий код:
SELECT COUNT(id)
FROM stats
GROUP BY DAYOFMONTH(record_date)
Надеюсь, это сэкономит время тем, кто будет искать эту тему.
В вашем SQL-запросе вы хотите подсчитать количество записей в таблице stats
, сгруппировав результаты по дате. Однако использование DATE_FORMAT
для группировки может быть не самым эффективным решением.
Вот более оптимизированный и простой вариант, который также сохраняет вашу структуру:
SELECT COUNT(*)
FROM stats
GROUP BY DATE(record_date);
Этот запрос использует функцию DATE()
, которая извлекает только дату из временной метки, позволяя вам группировать данные по дням без необходимости формировать строку в формате даты. Это решение более короткое и производительное, поскольку DATE()
работает быстрее, чем DATE_FORMAT()
, так как не требует обработки строки.
Как вернуть только дату из типа данных DateTime в SQL Server
Получение последней записи в каждой группе - MySQL
Сравнение двух дат в JavaScript
Когда использовать одинарные кавычки, двойные кавычки и обратные кавычки в MySQL
Как восстановить дамп-файл из mysqldump?