航空数据库MySQL函数无返回值求助:计算预订与航班日期月差
问题分析与解决
你的TIME_LEFT函数无返回结果,核心问题有三个:
- 参数名
RES_NO和RESERVATIONS表的字段名完全重名,导致WHERE RES_NO = RES_NO变成恒成立的条件,无法定位到指定的预订记录 - 没有通过JOIN关联
RESERVATIONS和FLIGHTS表,仅从RESERVATIONS表查询却引用FLIGHTS的字段,逻辑不成立 - 变量名
TIME_LEFT和函数名重名,虽然MySQL允许,但容易引发混淆
修正后的函数代码
DELIMITER // CREATE FUNCTION TIME_LEFT(p_res_no INT) RETURNS INT DETERMINISTIC BEGIN DECLARE time_diff INT DEFAULT 0; SELECT TIMESTAMPDIFF(MONTH, r.RES_DATE, f.FLIGHT_DATE) INTO time_diff FROM RESERVATIONS r INNER JOIN FLIGHTS f ON r.FLIGHT_NO = f.FLIGHT_NO WHERE r.RES_NO = p_res_no; RETURN time_diff; END; // DELIMITER ;
关键修正点说明
- 将参数名改为
p_res_no,避免与表字段名冲突,确保WHERE条件能精准匹配指定的预订编号 - 使用
INNER JOIN通过FLIGHT_NO关联两张表,正确获取对应航班的日期 - 变量名改为
time_diff,避免与函数名重名,提升代码可读性 - 给表名添加别名(
r代表RESERVATIONS,f代表FLIGHTS),简化代码书写
测试调用
执行以下语句即可得到预期结果:
SELECT TIME_LEFT(3143);
对于RES_NO=3143的记录,预订日期是2021-05-09,航班日期是2023-10-04,计算后会返回29(月份差值)。
内容的提问来源于stack exchange,提问作者mantz
相关产品推荐
相关产品推荐

