SQL 使用递归递增日期
SQL increment date using recursion
我有一个 table,其中包含以下结构:
|-----------|------------|-----------|
| Number | Date | Subject |
|-----------|------------|-----------|
| 1 | 2015-01-01 | ABC |
| 2 | 2015-01-01 | ABC |
| 3 | 2015-01-01 | ABC |
| 4 | 2015-01-01 | ABC |
|-----------|------------|-----------|
我需要遍历 table 并在每个日期增加 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 是通过使用需要 previous generated date 的函数生成的
我正在尝试使用 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
那是因为递归 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
我有一个 table,其中包含以下结构:
|-----------|------------|-----------|
| Number | Date | Subject |
|-----------|------------|-----------|
| 1 | 2015-01-01 | ABC |
| 2 | 2015-01-01 | ABC |
| 3 | 2015-01-01 | ABC |
| 4 | 2015-01-01 | ABC |
|-----------|------------|-----------|
我需要遍历 table 并在每个日期增加 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 是通过使用需要 previous generated date 的函数生成的 我正在尝试使用 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
那是因为递归 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