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

如何在TSQL中用递增日期变量循环查询月度订单数据?

实现TSQL逐日循环查询整月订单数据

需求是基于指定年月,逐日递增日期参数执行查询,提取两类订单:

  • 特定日期前下单,且在该日期时处于发货中(发货日期晚于该日期)的订单
  • 到该日期仍未完成发货(Date Shipped为NULL)的订单

原代码需要手动修改@DAY参数反复执行,效率很低,下面是优化后的自动循环版本:

-- 定义年月参数,按需修改
DECLARE @TargetMonth INT = 1
DECLARE @TargetYear INT = 2024

-- 初始化起始日期为目标年月的第一天
DECLARE @CurrentDate DATE = DATEFROMPARTS(@TargetYear, @TargetMonth, 1)
-- 定义目标年月的最后一天
DECLARE @EndDate DATE = EOMONTH(@CurrentDate)

-- 创建临时表存储整月查询结果
CREATE TABLE #DailyOrderStats (
    [ORDER TYPE] VARCHAR(50),
    [Order Count] INT,
    [Percent] DECIMAL(5,4),
    [DATE] DATE
)

-- 循环遍历当月每一天
WHILE @CurrentDate <= @EndDate
BEGIN
    INSERT INTO #DailyOrderStats
    SELECT
        o.[ORDER TYPE],
        COUNT(*) AS [Order Count], 
        ROUND(COUNT(*) * 1.0 / SUM(COUNT(*)) OVER(), 4) AS [Percent],
        @CurrentDate AS [DATE]
    FROM orders AS o
    WHERE 
        -- 订单下单日期不晚于当前循环日期
        o.[Date Purchased] <= @CurrentDate
        -- 订单要么未发货,要么发货日期不早于当前循环日期
        AND (o.[Date Shipped] >= @CurrentDate OR o.[Date Shipped] IS NULL)
    GROUP BY o.[ORDER TYPE]  -- 原代码遗漏GROUP BY,否则聚合函数执行会报错,此处补上

    -- 日期递增一天
    SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate)
END

-- 输出整月统计结果
SELECT * FROM #DailyOrderStats ORDER BY [DATE], [ORDER TYPE]

-- 清理临时表
DROP TABLE #DailyOrderStats

关键改进点:

  • 用DATEFROMPARTS和EOMONTH自动适配不同月份的天数,不用手动判断2月、31天月份等特殊情况
  • 使用日期类型变量替代字符串拼接,彻底避免日期格式转换错误
  • 用临时表统一存储每日结果,最后一次性输出,比逐次打印更高效
  • 补上原代码遗漏的GROUP BY子句,确保聚合函数正常执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:22:11