为什么这不起作用?我想显示一个新列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`;
请参阅demo
答案 0 :(得分:2)
实际上,您的查询中有错别字...您将所有方括号放错了位置,例如这个:
WHEN (MONTH(`birth_date` <= 6)) THEN
应该是:
WHEN (MONTH(`birth_date`) <= 6) THEN
答案 1 :(得分:1)
您的查询不正确。您的条件不正确:
(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;
答案 2 :(得分:1)
在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