MySQL存储过程中日期小于比较参数不生效问题求助
问题原因
- 最核心的错误是引用输入参数时错误添加了
@前缀:MySQL中带@前缀的是用户会话变量,和你存储过程定义的IN参数RefDate是完全独立的变量。你没有对@RefDate赋值的情况下,它的默认值为NULL,所有涉及NULL的比较运算结果都不成立,导致WHERE条件过滤掉了所有数据,SUM统计值为0,最终返回结果就是0。 - 冗余的类型转换:
RefDate本身就是DATE类型,不需要调用DATE_FORMAT转成字符串再做日期比较,隐式类型转换也可能引发判断异常。 - 门店参数未使用:当前代码里门店条件写死为
'Main store',没有用到传入的Store参数,后续多门店查询会出现错误。
解决方法
修改存储过程内的对应代码:
- 把所有的
DATE_FORMAT(@RefDate,'%Y-%m-%d')替换为RefDate,去掉@前缀和多余的格式转换 - 把写死的门店值
'Main store'替换为传入的Store参数
修改后的参考代码如下:
BEGIN SELECT (Purchase+SalesReturns+TransferIn)-(PurchaseReturns+Sales+TransferOut) INTO @STBL FROM( SELECT COALESCE(P.Purchase,0)AS 'Purchase', COALESCE(Sr.SalesReturn,0)AS 'SalesReturns', COALESCE(Ti.TransferIn,0)AS 'TransferIn', COALESCE(Pr.PurchaseReturns,0)AS 'PurchaseReturns', COALESCE(S.Sales,0) AS 'Sales', COALESCE(Tout.TransferOut,0)AS 'TransferOut' FROM( (SELECT 'OTHRMA1032' AS 'Item', SUM(movement.itemQty) AS 'Purchase' FROM movement WHERE movement.movementType=0 AND movement.entryDate<=RefDate AND movement.itemId='OTHRMA1032' AND movement.reference2 IN( SELECT purchaseinvoice.GRNId FROM purchaseinvoice WHERE purchaseinvoice.invoiceDate<=RefDate AND purchaseinvoice.inwardStore=Store ))P
修改完成后重新创建存储过程,再调用即可返回正确的库存结余值。
内容的提问来源于stack exchange,提问作者Sameera
相关产品推荐
相关产品推荐

