如何在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
相关产品推荐
相关产品推荐

