【发布时间】:2022-01-24 04:09:58
【问题描述】:
我是 NodeJS 的新手,正在从事一个物联网项目,该项目从多个设备收集数据并使用 ECharts 显示在基于 Web 的服务上,并带有趋势线图。数据以秒为间隔存储在 MariaDB 中。 (通常每 10 秒一次)
前端请求以下数据格式显示折线图。
{
"name": "Line Info",
"timestamp": [
"2021-12-23 08:19:07",
"2021-12-23 08:19:17",
"2021-12-23 08:19:27"
],
"PowerInput": [
3.05718,
3.05718,
3.05718
],
"ProdRemaintime": [
1.83674e-40,
1.83674e-40,
1.83674e-40
],
...
}
问题是,当设备处于非活动状态时,它会停止向 MariaDB 发送和存储数据。因此当设备再次上线时,MariaDB中的连续数据行之间会有时间间隔。
| # | TimeStamp | PowerInput | FinalDieDiameter | GearOilTemp |
|---|---|---|---|---|
| 1 | 2021-12-23 09:50:58.585000 | 3.05718 | 2.05 | 33.8511 |
| 2 | 2021-12-23 09:51:08.586000 | 3.05716 | 2.05 | 33.8511 |
| 3 | 2021-12-23 09:51:18.588000 | 3.05712 | 2.05 | 33.8511 |
| 4 | 2021-12-23 09:54:10.346000 | 1.21436 | 2.00 | 30.4218 |
| 5 | 2021-12-23 09:54:20.331000 | 1.62327 | 2.00 | 30.4971 |
这导致 ECharts 仅从有数据时开始显示,不包括设备离线时。 demo
(我查询的数据时间跨度为 12/21/2021 15:00 ~ 12/22/2021 11:21,但在 MariaDB 中我只有 12/21/2021 15:04:17 之前的数据。)
为了让用户看到设备上线和下线的趋势,我正在寻找解决方案来填补时间戳空白,并将空值添加到数据集。
{
"name": "Line Info",
"timestamp": [
"2021-12-23 09:51:08",
"2021-12-23 09:51:18",
"2021-12-23 09:51:28", // add missing timestamp
"2021-12-23 09:51:38", // add missing timestamp
... // add missing timestamp
"2021-12-23 09:54:08", // add missing timestamp
"2021-12-23 09:54:10",
"2021-12-23 09:54:20"
],
"PowerInput": [
3.05718,
3.05718,
null, // add missing data as null
null, // add missing data as null
... // add missing data as null
null, // add missing data as null
3.05718,
3.05718
],
...
}
我之前的解决方案是先收集一个时间范围内的所有数据,然后找到时间间隔,并通过NodeJS填补缺失的时间戳和空值,以便为ECharts生成一个完整的数据集。但是当时间差距很大时,性能真的很差。有没有其他方法可以做到这一点?
** 我在 StackOverflow 上找到了这个:Fill in missing timestamp values in SQL,但我仅限于不使用额外的 SQL 内存,因此创建新表并加入它们不是我的选择。
对于如何实现这一点,我将不胜感激。
【问题讨论】:
标签: mysql node.js database mariadb