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

MySQL存储过程中日期小于比较参数不生效问题求助

问题原因
  • 最核心的错误是引用输入参数时错误添加了@前缀:MySQL中带@前缀的是用户会话变量,和你存储过程定义的IN参数RefDate是完全独立的变量。你没有对@RefDate赋值的情况下,它的默认值为NULL,所有涉及NULL的比较运算结果都不成立,导致WHERE条件过滤掉了所有数据,SUM统计值为0,最终返回结果就是0。
  • 冗余的类型转换:RefDate本身就是DATE类型,不需要调用DATE_FORMAT转成字符串再做日期比较,隐式类型转换也可能引发判断异常。
  • 门店参数未使用:当前代码里门店条件写死为'Main store',没有用到传入的Store参数,后续多门店查询会出现错误。
解决方法

修改存储过程内的对应代码:

  1. 把所有的DATE_FORMAT(@RefDate,'%Y-%m-%d')替换为RefDate,去掉@前缀和多余的格式转换
  2. 把写死的门店值'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:27:04