MySQL存储过程日期入参异常:调用后返回NULL问题排查
解决MySQL存储过程调用返回NULL的问题
嘿,我一眼就瞅出你存储过程里的问题了,这两个小错误直接导致查询没匹配到任何数据,所以返回了NULL:
- 错误的日期格式字符串:你用的
str_to_date(startDate, '%Y-%m-d%')有两处问题:一是日的格式符应该是%d(两位数字格式)而不是d;二是末尾多了个多余的%符号。这会让str_to_date转换失败得到NULL,WHERE条件里和NULL做比较的结果永远是不匹配,自然查不到数据。 - 多余的日期转换操作:你的输入参数
startDate和endDate已经定义为DATE类型了,MySQL会自动把你传入的日期字符串(比如'2018-01-01')转换成DATE类型,完全没必要再用str_to_date画蛇添足,反而搞出问题。
给你修正后的存储过程代码:
CREATE DEFINER=`*****`@`localhost` PROCEDURE `Payable_Total_Net`( IN startDate DATE, IN endDate DATE, OUT totalNet DECIMAL(19,4) ) BEGIN SELECT SUM(COALESCE(p.netamt, 0)) INTO totalNet FROM Payables p WHERE p.purdate BETWEEN startDate AND endDate; END
这个版本直接用DATE类型参数和purdate做范围比较,既避免了转换错误,还能利用purdate字段上的索引(如果有的话)提升查询效率。
你还是用原来的调用方式测试就行:
Call Payable_Total_Net('2018-01-01','2018-12-31',@totalNet); SELECT @totalNet;
这次就能得到和普通SQL查询一致的正确结果了。
内容的提问来源于stack exchange,提问作者rainbasa
相关产品推荐
相关产品推荐

