如何用范围内的时间填充缺失的日期?
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
.
上的聚合函数
我有 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
.