sql - 创建序列表(整数和日期)
问题描述
有时我需要创建定期出现的日期或整数序列表。我手动创建它们并且有效,但由于存在大量代码重复,因此更难以维护。有什么更易于维护的方式来表示定期出现的整数或日期序列?
这是我目前的方法:
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
解决方案
您可以使用递归 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);
推荐阅读
- html - 如何显示一个引导范围以及如何在输入字段中显示值?
- redis - 连接 Redis 服务器失败
- javascript - 可以使用纯浏览器 JS 进行网页抓取吗?
- swift - 如何使用 NavigationLink 在 SwiftUI 中创建文本(仅文本中的一些单词)
- android-studio - 从服务器端运行套接字应用程序(Android 工作室)
- python - 防止python脚本使用所有ram
- html - CSS Grid:让某些孩子定义容器高度并迫使其他孩子缩小到它
- python - 如何从 nsmallest 而不是 .core.series.Series 中获取价值
- flutter - 登录后如何从 rest API 获取 Flutter Provider 状态?
- alpine.js - 如何在 alpinejs 的 x-text 中不出现 NAN 错误