#mysql
#mysql
Вопрос:
У меня есть следующая таблица сезонов:
| id | name | start_month | end_month |
------------------------------------------
| 101 | Summer | 12 | 2 |
| 102 | Winter | 6 | 8 |
| 103 | Spring | 9 | 11 |
| 104 | Fall | 3 | 5 |
Мне нужно получить сезон по месяцам. Допустим, текущий месяц равен 2 (февраль), я хочу, чтобы результатом было лето.
Я могу заставить работать другие сезоны, просто указав условие where start_month >= 4 and end_month <= 4
. Но это не будет работать с летом, так как сезон переходит в следующий год.
Что мне нужно сделать, чтобы справиться со случаем лета?
Одним из решений, о котором я подумал, было использовать даты вместо номера месяца, например 1980-12-01
, и использовать between
функцию, но это становится немного сложным для пользователя.
Было бы здорово, если бы он мог работать только с номерами месяцев.
Комментарии:
1. Как я вижу, это не зависит от года. Вы можете извлечь месяц из даты и сравнить.
2. Вы говорите о втором решении с использованием дат?
3. Февраль — это просто. Январь — более интересная проблема.
4. Решение должно быть одинаковым для обоих и даже работать для других сезонов. Вы не можете сказать
current month = end month
, что это решено. Февраль — это просто пример.5. Возможно, проще иметь таблицу seaons, содержащую 12 месяцев
Ответ №1:
Вы могли бы сделать:
(month(d) between start_month and end_month) or
(start_month>end_month and (month(d)>=start_month or month(d)<=end_month))
См. db-fiddle
Комментарии:
1. Я думал о чем-то подобном либо внутри двух месяцев, либо вне их обоих.