SQL Server 2016:根据表中起止日期生成分钟级时间序列存入表变量
生成SQL Server 2016分钟级时间序列解决方案
嘿,我来帮你搞定这个在SQL Server 2016里生成分钟级时间序列的需求!因为SQL Server 2016还没有内置的GENERATE_SERIES函数,所以我们可以用递归CTE结合表变量来实现。下面是完整的可运行代码:
步骤1:定义原始数据的表变量
首先我们把你的原始时间区间数据存入一个表变量:
DECLARE @SourceTable TABLE ( StartTime DATETIME, EndTime DATETIME ); -- 插入你的原始时间区间数据 INSERT INTO @SourceTable (StartTime, EndTime) VALUES ('2018-01-01 00:00', '2018-01-01 23:59'), ('2018-01-12 05:33', '2018-01-13 13:31'), ('2018-01-24 22:00', '2018-01-27 01:44');
步骤2:定义存储结果的表变量
接下来创建用来存放最终分钟序列的表变量:
DECLARE @TimeSeries TABLE ( MinuteTimestamp DATETIME );
步骤3:用递归CTE生成分钟序列
通过递归CTE逐个生成每个区间内的分钟时间戳,直到覆盖整个时间范围:
WITH MinuteCTE AS ( -- 锚点成员:初始化每个时间区间的起始时间 SELECT StartTime AS CurrentMinute, EndTime FROM @SourceTable UNION ALL -- 递归成员:每次给当前时间加1分钟,直到超过区间结束时间 SELECT DATEADD(MINUTE, 1, CurrentMinute), EndTime FROM MinuteCTE WHERE DATEADD(MINUTE, 1, CurrentMinute) <= EndTime ) -- 将生成的时间序列插入结果表变量 INSERT INTO @TimeSeries (MinuteTimestamp) SELECT CurrentMinute FROM MinuteCTE ORDER BY CurrentMinute -- 注意:如果时间区间超过100分钟,必须加上这个选项取消递归次数限制 OPTION (MAXRECURSION 0);
验证结果
你可以通过查询结果表变量来查看生成的分钟序列:
SELECT MinuteTimestamp FROM @TimeSeries;
关键说明
- 递归CTE的默认最大递归次数是100,而你的第三个时间区间(从2018-01-24 22:00到2018-01-27 01:44)包含的分钟数远超过100,所以必须加上
OPTION (MAXRECURSION 0)来避免报错。 - 这个方案会严格包含每个区间的起始时间,直到结束时间的最后一分钟(比如第一个区间的
2018-01-01 23:59会被包含进去)。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

