You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:31:06