能否拼接两个SQL列后传入DATE_ADD函数计算订阅到期时间
SQL订阅到期时间查询修正方案
原写法错误原因
MySQL 的 DATE_ADD 函数中,INTERVAL 语法要求后面的时间单位为固定关键字,不支持直接传入动态拼接的字符串,因此你原有拼接sub_duration和sub_type直接传入的写法无法生效。
推荐解决方案
方案1:CASE WHEN 分支判断(全版本兼容,优先推荐)
通过分支判断匹配对应时间单位,语法稳定无注入风险,适配所有MySQL版本,适合生产环境使用:
SELECT s.* -- 若实际表名为 subscribe 请替换下方表名 FROM subscription s WHERE CASE s.sub_type WHEN 'week' THEN DATE_ADD(s.last_renewal, INTERVAL s.sub_duration WEEK) WHEN 'month' THEN DATE_ADD(s.last_renewal, INTERVAL s.sub_duration MONTH) WHEN 'year' THEN DATE_ADD(s.last_renewal, INTERVAL s.sub_duration YEAR) END < CURDATE();
方案2:动态预编译SQL(仅可控场景使用)
如果后续可能新增sub_type枚举值,需要动态适配单位,可以在存储过程等可控场景使用预编译SQL:
-- 仅示例,业务中可根据实际需求封装为存储过程 SET @sql = 'SELECT * FROM subscription WHERE DATE_ADD(last_renewal, INTERVAL ? ?) < CURDATE()'; PREPARE stmt FROM @sql; -- 传入动态时长和单位参数 SET @duration = 2, @unit = 'YEAR'; EXECUTE stmt USING @duration, @unit; DEALLOCATE PREPARE stmt;
内容的提问来源于stack exchange,提问作者Osah Prince
相关产品推荐
相关产品推荐

