Выберите день недели из даты

#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().