Решение, приведенное в другом месте, WHERE date.MONTH() || date.DAY() BETWEEN '0621' AND '0921'
, является хорошим (и его стоит проголосовать, так как оно подходит для большинства баз данных MySQL), но я хотел бы отметить, что оно (и большинство запросов, которые включают функции для каждой строки) ) не подойдет для больших таблиц.
Конечно, мой опыт показывает, что MySQL не так часто используется для размеров, где это имело бы огромное значение, но, если это так, вам также следует учитывать следующее.
Уловка, которую мы использовали в прошлом, заключается в объединении дополнительных столбцов с триггерами вставки / обновления, так что стоимость вычисления возникает только при необходимости (при изменении данных), а не на каждом выберите.
Поскольку подавляющее большинство баз данных читается гораздо чаще, чем записано, это амортизирует стоимость, которая выше всех выборок.
Например, добавьте новый столбец CHAR(4)
с именем MMDD
и добавьте в него индекс. Затем настройте триггеры вставки / обновления для таблицы так, чтобы столбец date
использовался для установки этого нового на основе уже предоставленной формулы date.MONTH() || date.DAY()
.
Затем при выполнении запроса пропустите функции для каждой строки и вместо этого используйте:
WHERE MMDD BETWEEN '0621' AND '0921'
Тот факт, что он индексируется, будет поддерживать скорость ослепительно высокой, при небольшой стоимости триггера во время вставки / обновления и дополнительного столбца.
Стоимость триггера не имеет значения, поскольку она меньше стоимости его выполнения для каждой выбранной операции. Дополнительное хранилище, необходимое для столбца, является недостатком, но, если вы изучите все вопросы, которые люди задают о базах данных, соотношение проблем со скоростью и проблем с хранилищем довольно велико: -)
И, хотя это технически «нарушает» 3NF в том смысле, что вы дублируете данные, это давняя традиция делать это по соображениям производительности, если вы знаете, что делаете (то есть триггеры уменьшают «ущерб»).