一尘不染

如何使用存储过程为日期范围内的每一天创建一行?

sql-server

我想创建一个存储过程,它将在给定日期范围内的每一天在表中创建一行。存储过程接受两个输入 - 用户所需日期范围的开始日期和结束日期。

所以,假设我有一张这样的桌子:

SELECT Day, Currency
FROM ConversionTable

Day 是一个 DateTime,而 Currency 只是一个整数。

为了简单起见,假设我始终希望每个插入的行的货币列为 1。因此,如果有人输入“2017 年 3 月 5 日”作为开始日期,输入“2017 年 4 月 11 日”作为结束日期,我想创建以下行:

2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1

编写存储过程代码以执行此操作的最佳方法是什么?我在我的测试环境中使用的是 SQL Server 2008 R2,但我们的真实环境使用的是 SQL Server 2012,因此如果 2012 中引入的新功能使这项任务更容易,我可以升级我的测试机器。


阅读 115

收藏
2022-11-21

共1个答案

一尘不染

一种选择是递归 CTE:

DECLARE @StartDate datetime = '2017-03-05'
       ,@EndDate   datetime = '2017-04-11'
;

WITH theDates AS
     (SELECT @StartDate as theDate
      UNION ALL
      SELECT DATEADD(day, 1, theDate)
        FROM theDates
       WHERE DATEADD(day, 1, theDate) <= @EndDate
     )
SELECT theDate, 1 as theValue
  FROM theDates
OPTION (MAXRECURSION 0)
;

MAXRECURSION由于 Scott Hodgin 的评论,在下面添加了提示。)

2022-11-21