如何在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
相关产品推荐
相关产品推荐

