Mysql 填充开始-结束时间戳之间的间隙

Mysql 填充开始-结束时间戳之间的间隙,mysql,sql,date,mariadb,Mysql,Sql,Date,Mariadb,我试图找到一个查询来填补开始和结束时间戳之间的空白。间隙/间隔应为分钟。我的目标是获得一个时间序列,根据结果创建一个图表,以可视化每个记录的时间段 样本日期 预期产量 我还不太熟悉CTE和游标。 有什么建议/帮助可以最好地解决它吗?这里有一种效率很低的方法,就是使用递归查询: with recursive cte as ( select id, value, dateStart, dateEnd from tbl union all select id, value, d

我试图找到一个查询来填补开始和结束时间戳之间的空白。间隙/间隔应为分钟。我的目标是获得一个时间序列,根据结果创建一个图表,以可视化每个记录的时间段

样本日期

预期产量

我还不太熟悉CTE和游标。
有什么建议/帮助可以最好地解决它吗?

这里有一种效率很低的方法,就是使用递归查询:

with recursive cte as (
    select id, value, dateStart, dateEnd from tbl
    union all
    select id, value, dateStart + interval 1 minute, dateEnd 
    from cte
    where dateStart < dateEnd
)
select row_number() over(order by id) id, value, dateStart date 
from cte
order by id
:


更有效的方法是使用MariaDB的seq伪表:

( SELECT '2000-01-01' + INTERVAL seq DAY AS dy FROM seq_0_to_36524 )
将在3毫秒内生成一个世纪的日期。是的,毫秒

SELECT s.dy
    FROM ( SELECT '2020-01-04 18:29:00' + INTERVAL seq MINUTE AS dy
                                      FROM seq_0_to_1440 ) AS s
    WHERE s.dy <= '2020-01-04 18:33:00';

+---------------------+
| dy                  |
+---------------------+
| 2020-01-04 18:29:00 |
| 2020-01-04 18:30:00 |
| 2020-01-04 18:31:00 |
| 2020-01-04 18:32:00 |
| 2020-01-04 18:33:00 |
+---------------------+
5 rows in set (0.00 sec)

这会在1ms内生成一天的日期,然后限制在所需的范围内。在你的情况下,你会离开连接到你的稀疏表。< /P>你正在运行MySQL或MariaDB的哪种版本?MialADB.4.4.11,但是使用MySQL或任何其他MiRADB/MySQL版本没有问题。认真考虑在应用程序代码数据显示中处理数据显示的问题是由第三方解决方案来处理的。当前数据需要转换。太棒了,谢谢!存储过程是一种更有效的方法吗? id | value | date -: | ----: | :------------------ 1 | 4 | 2020-01-04 16:29:00 2 | 4 | 2020-01-04 16:30:00 3 | 4 | 2020-01-04 16:31:00 4 | 4 | 2020-01-04 16:32:00 5 | 4 | 2020-01-04 16:33:00 6 | 3 | 2020-01-04 18:29:00 7 | 3 | 2020-01-04 18:30:00 8 | 3 | 2020-07-16 09:10:00 9 | 3 | 2020-07-16 09:11:00 10 | 3 | 2020-07-16 09:12:00
( SELECT '2000-01-01' + INTERVAL seq DAY AS dy FROM seq_0_to_36524 )
SELECT s.dy
    FROM ( SELECT '2020-01-04 18:29:00' + INTERVAL seq MINUTE AS dy
                                      FROM seq_0_to_1440 ) AS s
    WHERE s.dy <= '2020-01-04 18:33:00';

+---------------------+
| dy                  |
+---------------------+
| 2020-01-04 18:29:00 |
| 2020-01-04 18:30:00 |
| 2020-01-04 18:31:00 |
| 2020-01-04 18:32:00 |
| 2020-01-04 18:33:00 |
+---------------------+
5 rows in set (0.00 sec)