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

如何在MySQL/SQL/MariaDB生成两日期间分钟时间序列(无现有数据)

没问题,我来帮你搞定这个需求——在MySQL或者MariaDB里生成两个指定日期之间的每分钟时间戳列表,而且完全不需要依赖数据库里已有的任何数据。下面给你两种实用的解决方案,分别适配不同版本的数据库:

方案1:使用递归CTE(MySQL 8.0+/MariaDB 10.2+)

如果你的数据库是较新版本的,递归CTE是最简洁直观的方式:

WITH RECURSIVE minute_timestamps AS (
    SELECT '2020-05-30 08:01:00' AS ts
    UNION ALL
    SELECT DATE_ADD(ts, INTERVAL 1 MINUTE)
    FROM minute_timestamps
    WHERE ts < '2020-05-30 12:01:00'
)
SELECT ts FROM minute_timestamps;

简单解释下:

  • 首先用初始的起始时间初始化CTE的第一条记录
  • 然后递归地给每条记录的时间加1分钟,直到时间小于你设定的结束时间为止
  • 这里用<而不是<=是因为起始时间已经包含在结果里了,避免多生成一条超出范围的记录

方案2:使用数字辅助表(兼容MySQL 5.x及更早版本)

如果你的数据库版本不支持递归CTE(比如MySQL 5.7及以前),可以用这种生成数字序列的方法来间接得到时间戳:

SELECT 
    DATE_ADD('2020-05-30 08:01:00', INTERVAL n MINUTE) AS ts
FROM (
    SELECT a.N + b.N * 10 + c.N * 100 AS n
    FROM 
        (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a,
        (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b,
        (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) c
) numbers
WHERE DATE_ADD('2020-05-30 08:01:00', INTERVAL n MINUTE) <= '2020-05-30 12:01:00';

这个方法的思路是:

  • 先通过嵌套的UNION生成一个0到499的数字序列(足够覆盖你例子里的240分钟)
  • 然后用DATE_ADD把起始时间加上对应的分钟数,得到每个时间戳
  • 如果你的时间范围更长(比如超过500分钟),只需要再增加一层数字表(比如d表,乘以1000)就行

额外小贴士

  • 如果需要经常用这个功能,可以把它封装成存储过程,传入起始和结束时间作为参数,调用起来更方便
  • 确保输入的时间格式和数据库的日期格式匹配,避免出现解析错误
  • MariaDB对递归CTE的支持和MySQL完全一致,上面的代码可以直接复用

内容的提问来源于stack exchange,提问作者Tonnbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:22:42