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

SQL实现两日期区间WHILE LOOP逻辑代码报错排查求助

SQL循环逻辑错误排查与修正

错误点汇总

  • 循环条件逻辑颠倒:初始@FechaMin(2020-09-28)小于@FechaMax(2021-05-17),原条件@FechaMin >= @FechaMax会导致循环完全不执行,需改为@FechaMin <= @FechaMax
  • 临时表重复创建报错:SELECT INTO会自动创建临时表,第一次循环执行后#Mov已存在,后续循环执行会抛出对象已存在的错误,需提前创建临时表,循环内改用INSERT INTO写入数据
  • 语法冗余错误:GROUP BY语句末尾多了多余的右括号),属于语法错误
  • 缺少循环步进逻辑:循环内没有更新@FechaMin的代码,会导致死循环,需按实际统计周期(如按天)每次循环后递增@FechaMin
  • 日期范围逻辑问题:原代码过滤条件Id_Fec_Diaria >= @FechaMin and Id_Fec_Diaria < @FechaMax会每次取整个区间的数据,和逐段统计的循环预期不符,需根据实际需求调整为对应周期的过滤逻辑

修正后完整代码

以下为按天逐天统计、结果汇总到#Mov表的实现代码,你可根据实际统计周期(周/月等)调整DATEADD参数和日期过滤逻辑:

-- 提前创建临时表,字段类型可根据实际表结构调整
CREATE TABLE #Mov (
    Suc INT,
    SKU VARCHAR(100),
    TipoMov INT,
    Prov VARCHAR(100),
    Uni INT,
    Imp_Vta DECIMAL(18,2)
)

DECLARE
@FechaMin DATE='2020-09-28',
@FechaMax DATE='2021-05-17';

WHILE (@FechaMin <= @FechaMax)
BEGIN 
    INSERT INTO #Mov (Suc, SKU, TipoMov, Prov, Uni, Imp_Vta)
    SELECT 
        Suc,
        SKU,
        TipoMov,
        Prov,
        SUM(Uni) as Uni,
        SUM(Imp_Vta) as Imp_Vta
    FROM dual
    WHERE (Mes BETWEEN 22009 AND 22105) 
        AND Suc = 11 
        AND TipoMov IN (4,5,8)
        AND Id_Fec_Diaria = @FechaMin
    GROUP BY 
        Suc,
        SKU,
        TipoMov,
        Prov
    
    -- 循环步进:每次加1天,按其他周期统计可修改DATEADD的第一个参数
    SET @FechaMin = DATEADD(DAY, 1, @FechaMin)
END

-- 验证统计结果
SELECT * FROM #Mov

内容的提问来源于stack exchange,提问作者Ren Cantu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:04