You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:37:22