使用递归的SQL递增日期

时间:2015-08-11 08:15:19

标签: mysql sql-server common-table-expression

我有一个包含以下结构的表:

|-----------|------------|-----------|
| Number    | Date       | Subject   |
|-----------|------------|-----------|
| 1         | 2015-01-01 | ABC       |
| 2         | 2015-01-01 | ABC       |
| 3         | 2015-01-01 | ABC       |
| 4         | 2015-01-01 | ABC       |
|-----------|------------|-----------|

我需要遍历表格,并在每个日期增加 n 天。 所以,假设 n = 10 我应该得到这个结果:

|-----------|------------|-----------|
| Number    | Date       | Subject   |
|-----------|------------|-----------|
| 1         | 2015-01-01 | ABC       |
| 2         | 2015-01-11 | ABC       |
| 3         | 2015-01-21 | ABC       |
| 4         | 2015-01-31 | ABC       |
|-----------|------------|-----------|

问题有点复杂,因为 n 是通过使用需要上一个生成日期的函数生成的 我正在尝试使用CTE来完成以下CTE,但是我获得的行数比预期的要多。

WITH myCte(Number, Date, Subject)
AS
(
   SELECT * FROM MyTable
   UNION ALL
   SELECT
      Number, dbo.get_next_date(Date)
   FROM MyCte
)
SELECT * FROM MyCte

1 个答案:

答案 0 :(得分:1)

这是因为递归CTE中没有WHERE子句。这将导致查询在达到MAXRECURSION值时停止(默认为100)。

以下是使用WHERE子句

设置限制的示例
DECLARE @MyTable TABLE
(
Number  int,
Dt      Date,
Sub   CHAR(3)
)

INSERT INTO @MyTable
VALUES
(1,'2015-01-01','ABC'),
(2,'2015-01-11','ABC'),
(3,'2015-01-21','ABC'),
(4,'2015-01-31','ABC') 



;WITH myCte(Number, Date, Subject)
AS
(
   SELECT * FROM @MyTable
   UNION ALL
   SELECT
      Number, DATEADD(day, 10, Date),Subject
   FROM MyCte
   WHERE Date < GETDATE()
)
SELECT * FROM MyCte

编辑 - 如果您知道行数,那么您可以使用TOP并获取这些行。

SELECT TOP 4 * FROM MyCte