为什么这不起作用?我想显示一个新列seasons
,其中包含每个学生出生日期的正确季节。
CREATE TABLE `students` (
`student_id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
`surname` varchar(45) DEFAULT NULL,
`birth_date` date DEFAULT NULL,
PRIMARY KEY (`student_id`)
);
查询:
SELECT *, CASE
WHEN (1 <= MONTH(`birth_date`))
AND (MONTH(`birth_date` <= 3)) THEN 'winter'
WHEN (MONTH(`birth_date` <= 6)) THEN 'spring'
WHEN (MONTH(`birth_date` <= 9)) THEN 'summer'
WHEN (MONTH(`birth_date` <= 12)) THEN 'autumn'
END AS `seasons`
FROM `students`;
查看演示
实际上,您的查询中有拼写错误...您放错了所有括号,例如:
WHEN (MONTH(`birth_date` <= 6)) THEN
应该是:
WHEN (MONTH(`birth_date`) <= 6) THEN
您的查询不正确。您有不正确的条件:
- 必须使用
(MONTH(birth_date) <= 12)
而不是(MONTH(birth_date <= 12))
- 例如,您使用"小于或等于"条件
MONTH(birth_date) <= 3
但第三个月是春天,第六个月是夏季。
尝试以下查询
SELECT *,
CASE
WHEN (MONTH(birth_date) BETWEEN 3 AND 5) THEN 'spring'
WHEN (MONTH(birth_date) BETWEEN 6 AND 8) THEN 'summer'
WHEN (MONTH(birth_date) BETWEEN 9 AND 11) THEN 'autumn'
ELSE 'winter'
END AS seasons
FROM students;
在 CASE 的每个 WHEN 行中,您的代码中都有一个逻辑错误。例如,如果birth_date
1982-04-01
则:
(MONTH(`birth_date` <= 6))
评估结果为
(MONTH(true))
因为您将括号放在错误的位置 - 它会评估语句
`birth_date` <= 6
然后将结果传递给 MONTH()
函数。当然MONTH(true)
是荒谬的,NULL
返回.内括号应该只在birth_date
字段上四舍五入,因为这是您想要从中获取月份的位!
这是一个工作版本:
SELECT *,
CASE
WHEN MONTH(`birth_date`) <= 3 THEN 'winter'
WHEN MONTH(`birth_date`) <= 6 THEN 'spring'
WHEN MONTH(`birth_date`) <= 9 THEN 'summer'
WHEN MONTH(`birth_date`) <= 12 THEN 'autumn'
END AS `seasons`
FROM `students`;
(我看不出需要
(1 <= MONTH(`birth_date`))
顺便说一句,部分和所有外部括号都是多余的(。
下面是一个工作演示,其中包含一些示例数据: https://www.db-fiddle.com/f/giQczqKvJNbdCJFwevJCk8/5