#mysql
#mysql
Вопрос:
У меня есть следующая таблица в MySQL, в которой записывается количество событий, происходящих каждый день
event_date event_count
2011-05-03 21
2011-05-04 12
2011-05-05 12
Я хочу иметь возможность эффективно запрашивать это по диапазону дат И по дням недели. Например — «Что такое event_count по вторникам в мае?»
В настоящее время поле event_date является типом даты. Существуют ли какие-либо функции в MySQL, которые позволяют мне запрашивать этот столбец по дням недели, или я должен добавить еще один столбец в таблицу для хранения дня недели?
Таблица будет содержать сотни тысяч строк, поэтому, учитывая выбор, я выберу наиболее эффективное решение (в отличие от самого простого).
Комментарии:
1. Спасибо за ваш хорошо написанный вопрос. Просто К вашему сведению — приветствия и теги title не одобряются на SO, поскольку это не форум. Надеюсь, вы найдете ответ, который ищете.
Ответ №1:
Используйте DAYOFWEEK в своем запросе, что-то вроде:
SELECT * FROM mytable WHERE MONTH(event_date) = 5 AND DAYOFWEEK(event_date) = 7;
Здесь будет найдена вся информация по субботам в мае.
Чтобы получить самые быстрые чтения, сохраните денормализованное поле, которое является днем недели (и все остальное, что вам нужно). Таким образом, вы можете индексировать столбцы и избегать полного сканирования таблицы.
Просто попробуйте сначала вышеописанное, чтобы увидеть, соответствует ли оно вашим потребностям, а если нет, добавьте несколько дополнительных столбцов и сохраните данные при записи. Просто следите за аномалиями обновления (обязательно обновите столбец day_of_week, если вы измените event_date).
Обратите внимание, что денормализованные поля увеличат время, затрачиваемое на выполнение операций записи, увеличат вычисления при записи и займут больше места. Убедитесь, что вам действительно нужна выгода, и вы можете измерить, помогает ли она вам.
Комментарии:
1. Для тех, кто работает в 2012 году, DAYOFWEEK не распознается после 2008 года. Для 2012 вместо этого используйте DAY. Отличный ответ, просто хотел сделать замечание для других, которые ищут, как это сделать в более новых версиях SQL Server.
Ответ №2:
Проверьте функцию DAYOFWEEK()
Ответ №3:
Если вы хотите текстовое представление дня недели — используйте функцию DAYNAME().