MySQL使用派生列计算日期差及会员入会时长分类报错求助
修正你的会员分类SQL语句
嘿,我看到你的SQL语句里有几个关键问题导致分类列无法正常生成,咱们来一步步解决:
问题分析
你的CASE表达式存在语法错误,还有多余的无效代码:
- 重复使用了
CASE关键字:正确的CASE结构只需要一个CASE开头,后续用WHEN...THEN来定义分支,最后用END结束。 - 多余的格式字符串:语句末尾的
, '%y%m%d'不属于CASE表达式的一部分,完全是无效代码,需要删除。
修正后的SQL代码
SELECT m.member_id, m.first_name, m.last_name, m.store_id, CASE WHEN m.reg_date <= '2018-04-01' THEN 'low' WHEN m.reg_date > '2018-04-01' AND m.reg_date <= '2018-07-31' THEN 'med' WHEN m.reg_date > '2018-07-31' THEN 'high' -- 可选:如果存在非日期值或NULL,添加ELSE分支处理异常情况 ELSE 'unknown' END AS category FROM member m;
额外建议
你提到语句“仅对reg_date列的非日期值有效”,这可能意味着你的reg_date列数据类型不是日期类型(比如是字符串)。如果是这种情况,建议:
- 优先修改列的数据类型为DATE/DATETIME,确保日期比较的准确性。
- 如果暂时无法修改列类型,需要先将字符串转换为日期再进行比较,比如:
- MySQL:用
STR_TO_DATE(m.reg_date, '%Y-%m-%d')替代m.reg_date - PostgreSQL/Oracle:用
TO_DATE(m.reg_date, 'YYYY-MM-DD')替代m.reg_date
- MySQL:用
内容的提问来源于stack exchange,提问作者Harris Hilton
相关产品推荐
相关产品推荐

