首页 > 解决方案 > 创建序列表(整数和日期)

问题描述

有时我需要创建定期出现的日期或整数序列表。我手动创建它们并且有效,但由于存在大量代码重复,因此更难以维护。有什么更易于维护的方式来表示定期出现的整数或日期序列?

这是我目前的方法:

DECLARE @IndexDate TABLE (
[Id] INT,
[Date] DATE
)
INSERT INTO @IndexDate (
Id, Date
)
VALUES 
(1, CONCAT(YEAR(GETDATE()), '-01-01')),
(2, CONCAT(YEAR(GETDATE()), '-02-01')),
(3, CONCAT(YEAR(GETDATE()), '-03-01')),
(4, CONCAT(YEAR(GETDATE()), '-04-01')),
(5, CONCAT(YEAR(GETDATE()), '-05-01')),
(6, CONCAT(YEAR(GETDATE()), '-06-01')),
(7, CONCAT(YEAR(GETDATE()), '-07-01')),
(8, CONCAT(YEAR(GETDATE()), '-08-01')),
(9, CONCAT(YEAR(GETDATE()), '-09-01')),
(10, CONCAT(YEAR(GETDATE()), '-10-01')),
(11, CONCAT(YEAR(GETDATE()), '-11-01')),
(12, CONCAT(YEAR(GETDATE()), '-12-01'))

SELECT * FROM @IndexDate

在此处输入图像描述

标签: sql

解决方案


您可以使用递归 cte:

WITH cte(n) AS (
   SELECT 1 
   UNION ALL
   SELECT n+ 1 
   FROM cte  
   WHERE n < 12
)
SELECT * 
FROM cte
OPTION (maxrecursion 0);

WITH cte(d) AS (
   SELECT CAST('20190101' AS DATE)
   UNION ALL
   SELECT DATEADD(m, 1, d)
   FROM cte  
   WHERE d < '20200101'
)
SELECT * 
FROM cte
OPTION (maxrecursion 0);

db<>小提琴演示


推荐阅读