Только начал знакомство с MySQL. Поясните почему я могу сделать так
SELECT `Дата заключения` AS Подписан,
CASE
WHEN month(`Дата заключения`) BETWEEN 3 AND 5 THEN 'Весна'
WHEN month(`Дата заключения`) BETWEEN 6 AND 8 THEN 'Лето'
WHEN month(`Дата заключения`) BETWEEN 9 AND 11 THEN 'Осень'
ELSE 'Зима'
END AS Сезон
FROM договор
ORDER BY Подписан DESC;
Но не могу сделать так
SELECT `Дата заключения` AS Подписан,
CASE month(`Дата заключения`)
WHEN BETWEEN 3 AND 5 THEN 'Весна'
WHEN BETWEEN 6 AND 8 THEN 'Лето'
WHEN BETWEEN 9 AND 11 THEN 'Осень'
ELSE 'Зима'
END AS Сезон
FROM договор
ORDER BY Подписан DESC;
То есть вопрос в том, как написать вычисление месяца один раз.
По стандарту SQL. Сокращенный CASE допускает только сравнение с конкретными значениями и только на равенство.
как написать вычисление месяца один раз
Можете, конечно, попробовать использовать переменную:
SELECT `Дата заключения` AS Подписан,
CASE
WHEN (@month:=month(`Дата заключения`)) BETWEEN 3 AND 5 THEN 'Весна'
WHEN @month BETWEEN 6 AND 8 THEN 'Лето'
WHEN @month BETWEEN 9 AND 11 THEN 'Осень'
ELSE 'Зима'
END AS Сезон
FROM договор
ORDER BY Подписан DESC;
Но, во-первых, профит копеечный, фиг заметишь, во-вторых, сервер не дурак, и скорее всего сам выполнит вычисление только один раз (он же формализует выражения).
Хотя я бы вообще сделал так:
SELECT `Дата заключения` AS Подписан,
ELT(1+(month(`Дата заключения`) DIV 3), 'Зима', 'Весна', 'Лето', 'Осень', 'Зима') AS Сезон
FROM договор
ORDER BY Подписан DESC;
Продвижение своими сайтами как стратегия роста и независимости