8

MySQL Запрос: Группировка по Дню / Месяцу / Году

10

Можно ли составить простой запрос для подсчета количества записей за определенный период времени, например, год, месяц или день, используя поле типа 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 ответ(ов)

2

Вопрос: Как можно сгруппировать записи по месяцам в MySQL?

Ответ: Вы можете использовать функцию DATE_FORMAT, чтобы сгруппировать записи по месяцам. Вот пример запроса:

GROUP BY DATE_FORMAT(record_date, '%Y%m')

Этот код сгруппирует записи по годам и месяцам, где %Y представляет собой полный год, а %m — месяц. Использование такого формата может быть удобным для анализа данных по месяцам.

Примечание (в основном, для потенциальных негативных голосующих). В настоящее время этот подход может быть не таким эффективным, как другие предложения. Тем не менее, я оставляю его в качестве альтернативы, которая также может помочь увидеть, насколько быстрее другие решения. (Вы действительно не можете определить скорость, пока не увидите разницу.) Кроме того, со временем могут быть внесены изменения в движок MySQL относительно оптимизации, что может сделать данное решение в каком-то (возможно, не столь далеком) будущем вполне сопоставимым по эффективности с большинством других.

0

Я пытался использовать оператор 'WHERE' в своем запросе, думал, что все правильно, так как никто не исправлял его. Но я ошибался. После некоторых поисков я обнаружил, что правильный вариант для оператора WHERE выглядит следующим образом. Так что код становится таким:

SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)
0

Если вам нужно фильтровать записи за конкретный год (например, 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 сек.

Последний вариант оказался самым быстрым.

0

Если вам нужно сгруппировать данные по дате в MySQL, используйте следующий код:

SELECT COUNT(id)
FROM stats
GROUP BY DAYOFMONTH(record_date)

Надеюсь, это сэкономит время тем, кто будет искать эту тему.

0

В вашем SQL-запросе вы хотите подсчитать количество записей в таблице stats, сгруппировав результаты по дате. Однако использование DATE_FORMAT для группировки может быть не самым эффективным решением.

Вот более оптимизированный и простой вариант, который также сохраняет вашу структуру:

SELECT COUNT(*) 
FROM stats
GROUP BY DATE(record_date);

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь