【问题标题】:Efficiently charting data by dates按日期有效地绘制数据图表
【发布时间】:2015-06-21 08:19:44
【问题描述】:

我想在时间序列折线图上显示用户输入的信息。 ChartJS 似乎是一种很好的免费方式来做到这一点。它需要一个日期数组,以及这些日期的值数组。

如果用户要求提供两个日期之间的数据,并按天分组。

在我的数据库中,我有一个表,每一行都有一个 UNIX 时间戳。我可以轻松调用特定日期的数据和分组,例如

SELECT some_metric 
FROM tbl_example 
WHERE date BETWEEN [start_ts] AND [end_ts] 
GROUP BY DAY(FROM_UNIXTIME(date))

我还有一个函数可以将两个日期之间的天数组成一个数组。

现在的问题是用户在某些日子没有数据,所以我需要修改 MySQL 吐出的数组,以便某些日子有 0。

除了可怕的双重嵌套foreach 在任一数组中交叉检查日期之外,还有一种有效的方法来修复 MySQL 或 PHP 中的数据间隙吗?


更新:This 似乎是在 JavaScript 端处理时间序列数据间隙的一种可能解决方案。


更新:我想出了一个相对简单的 20 行 PHP 解决方案。它重新格式化 MySQL 吐出的值数组,并为每个日期对该数组进行if (isset(...)) 检查,然后为该日期添加 0。

到目前为止,它已经完成了几天的工作,但我必须更深入地研究它才能在几周和几个月内工作。

【问题讨论】:

  • 这可以通过 mysql 通过为给定范围动态生成天数然后通过左连接表来完成。但是查询有些复杂。这是一个类似的stackoverflow.com/questions/23300303/…
  • 这很聪明也很有趣。但正如您所说,仅用于填补数据空白就相当复杂。
  • 我说很复杂,因为它看起来很复杂,但事实并非如此。如果您查看查询,它只会生成动态日期,然后进行左连接,因此它将填补不存在的空白在原始查询中。
  • 只在应用层处理缺失的结果。

标签: php mysql date


【解决方案1】:

我建议使用此方法为start_tsend_ts 之间的日期生成值:

Get a list of dates between two dates

然后UNION 显示您的结果。

这样可以省去在php中迭代结果的麻烦...

如果您在some_metric 上使用某种聚合(例如SUMCOUNT),您可以使用生成的日期、NULL0 值生成一个名为some_metric 的新字段,以及无论这些日期是否存在记录,聚合都是有效的。

【讨论】:

  • 谢谢,make_intervals() 方法看起来很有用。
  • 一个可能的解决方案是在数据库中有一个现有的天表到UNION 。这不是比每次动态生成一个临时表更高效吗?
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2018-05-23
  • 2021-12-17
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多