如何用范围内的时间填充缺失的日期?

How to fill missing dates with time in range?

我有 table,其中有带时间的日期和一列带值的列。每 10 秒 table 应该获得一个新记录。看起来像:

Date                      Val1
2020-10-03 10:12:21       30
2020-10-03 10:12:31       30
2020-10-03 10:12:41       30
2020-10-03 10:12:51       30
2020-10-03 10:13:01       30
...
2020-12-07 10:13:24       20
2020-12-07 10:13:34       20

我需要检查日期之间的值,例如: 从 2020-10-03 10:00 到 2020-12-07 12:30, 每 5/15/30 分钟或 1 小时:

Date                   Val1
2020-10-03 10:00       30
2020-10-03 10:30       30
2020-10-03 11:00       30
2020-10-03 11:30       30
2020-10-03 12:00       30
...
2020-12-07 12:00       20
2020-12-07 12:30       20

我试图在 MySQL 中使用:

SELECT DATE_FORMAT(Date, "%Y-%m-%d %H:%i") as Date, Val1
FROM table 
WHERE Date >= "2020-10-03 10:00" AND Date <= "2020-12-07 12:30" 
GROUP BY unix_timestamp(Date) 
DIV 1800

但如果我没有每个日期时间,它就不能很好地工作。

如何用NULL值填充缺失的日期?我需要每一分钟 (如果间隔以分钟为单位,如果间隔以小时为单位,则每小时一次)。

如果你是运行 MySQL 8.0,你可以使用递归查询生成日期范围,然后把table带上left join:

with recursive cte as (
    select '2020-10-03 10:00:00' dt
    union all select dt + interval 1 minute from cte where dt < '2020-12-07 12:30:00'
)
select c.dt, avg(t.val1) as val1
from cte c
left join mytable t on t.date >= c.dt and t.date < c.dt + interval 1 minute
group by c.dt

当给定分钟内有多个记录时,取 val1 的平均值。在这方面,这修复了您的原始查询,该查询缺少 val1.

上的聚合函数