MySQL存储过程中CTE语法错误排查及参数使用问题求助
MySQL存储过程CTE语法错误修复方案
你的错误和CTE使用输入参数无关,是纯语法问题,具体问题点和修复如下:
错误点分析
SELECT *与后续CASE语句之间缺少逗号,MySQL无法正确解析字段列表- CTE子查询的
WHERE语句末尾多了一个分号,破坏了CTE的语法结构
修正后的完整代码
DROP PROCEDURE IF EXISTS get_leave_deduction; DELIMITER $$ CREATE PROCEDURE get_leave_deduction( IN emp_ID VARCHAR(255), IN month_ INT, IN year_ YEAR ) BEGIN DECLARE last_date DATE; SET last_date = LAST_DAY(DATE(CONCAT_WS('-', year_, month_, 1))); WITH tmp_table AS ( SELECT *, CASE WHEN tl.end_date > last_date THEN DATEDIFF(last_date, tl.start_date) + 1 ELSE DATEDIFF(tl.end_date, tl.start_date) + 1 END AS num_days FROM takes_leave AS tl WHERE tl.emp_ID = emp_ID AND MONTH(tl.start_date) <= month_ AND YEAR(tl.start_date) = year_ ) SELECT * FROM tmp_table; END$$ DELIMITER ; CALL get_leave_deduction("8", 11, 2023);
补充说明
- 日期计算:
DATEDIFF(a,b)返回的是两个日期的天数差(不含首尾其中一天),如果业务需要统计完整请假天数(包含开始和结束日),需在结果上加1,可根据实际需求调整 - 标识符规范:
num_days建议不用单引号包裹,MySQL中直接书写或用反引号num_days更规范 - CTE支持参数:CTE完全可以引用存储过程的输入参数和DECLARE声明的变量,之前的报错只是语法错误引发的误解
内容的提问来源于stack exchange,提问作者Om Mali
相关产品推荐
相关产品推荐

