MS SQL Server 2016:如何为指定日期范围的每个日期复制表中所有行
解决方案:为指定日期范围生成每日产品数据
针对MS SQL Server 2016,你可以通过递归CTE生成日期序列,再与产品表做交叉连接的方式实现需求,具体代码如下:
假设你的产品表名为Products,执行以下SQL语句:
-- 定义日期范围参数 DECLARE @StartDate DATE = '2023-01-01'; DECLARE @EndDate DATE = '2023-01-03'; -- 递归CTE生成日期序列 WITH DateRange AS ( SELECT @StartDate AS Date UNION ALL SELECT DATEADD(DAY, 1, Date) FROM DateRange WHERE Date < @EndDate ) -- 交叉连接产品表,生成每日产品数据 SELECT FORMAT(dr.Date, 'dd/MM/yyyy') AS Date, p.Product_ID, p.Product_Name, p.Unit_Price FROM DateRange dr CROSS JOIN Products p ORDER BY dr.Date, p.Product_ID OPTION (MAXRECURSION 0); -- 解除递归层数限制(默认最多100层,日期范围超过100天需要加这个)
代码说明:
- 日期参数定义:通过
DECLARE设置起止日期,可根据需求灵活修改。 - 递归CTE生成日期:从起始日期开始,每天递增1天,直到达到结束日期。
- 交叉连接:将生成的每个日期与产品表的所有行关联,得到每个日期对应的全量产品数据。
- 格式处理:用
FORMAT函数将日期转为你需要的dd/MM/yyyy格式。 - 递归层数限制:
OPTION (MAXRECURSION 0)用于支持超过100天的日期范围,SQL Server默认递归层数上限为100。
执行后即可得到你期望的结果:每个日期下都包含所有产品的完整数据。
内容的提问来源于stack exchange,提问作者KHFC_1886
相关产品推荐
相关产品推荐

