javascript - 如何动态生成图表的日期/时间值?

标签 javascript php mysql charts

我在 MySQL 数据库中有过去几年的一大组数据。这些行中的每一行都有一个时间戳列。这就是我想在图表中用于 x 轴的内容。

我想做的是将这些日期分解为逻辑组,并向用户显示包含正确日期和与该时间范围相关的汇总数据的图表。用户将能够动态选择日期范围。

我想要的是类似的东西:例如,当用户选择今天(或一天的框架)时,我希望软件将数据分成 2 小时的 block 是12个数据集(我的空间只有12个)。但是,如果他们选择 2 天,我也想将其分成 12 个相等的部分。如果他们选择 15 天、3 年等,我仍然希望脚本将数据分成 12 block (同时汇总行的数据)。

这是我想以某种方式动态实现的结果示例。为此,我可以使用 MySQL、PHP 和 Javascript。以下格式只是一种表示形式,可以是数组,对象,任何东西:

例如,这是我在数据库中的数据:

id  |   value   |   date                |
-----------------------------------------
1   |   12      |   2017-01-23 00:13:12 |
2   |   54      |   2017-01-23 08:33:23 |
3   |   45      |   2017-01-23 09:01:57 |
4   |   94      |   2017-01-22 05:17:15 |
5   |   67      |   2017-01-22 10:12:44 |
6   |   3       |   2017-01-22 22:56:54 |
7   |   44      |   2017-01-22 23:27:55 |
8   |   19      |   2017-01-21 15:02:23 |
9   |   8       |   2017-01-21 00:14:54 |

这是在将数据发送到我的图表之前我想要的:

id  |   value   |   date                |
-----------------------------------------
1   |   12      |   2017-01-23 06:00:00 |
2   |   99      |   2017-01-23 12:00:00 |
3   |   0       |   2017-01-23 18:00:00 |
4   |   0       |   2017-01-23 23:59:59 |
5   |   94      |   2017-01-22 06:00:00 |
6   |   67      |   2017-01-22 12:00:00 |
7   |   0       |   2017-01-22 18:00:00 |
8   |   47      |   2017-01-21 23:59:59 |
9   |   8       |   2017-01-21 06:00:00 |
10  |   0       |   2017-01-21 12:00:00 |
11  |   19      |   2017-01-21 18:00:00 |
12  |   0       |   2017-01-21 23:59:59 |

同样,日期范围是多少并不重要,脚本应自动将其分成 12 个相等的部分。

知道如何实现吗?我在 Internet 上看到了很多此类图表,并且必须有一种简单的方法来执行此操作 - 而不仅仅是手动对条件进行编码。

最佳答案

您可以使用 SQL、PHP 和 JavaScript 执行此操作。选择实际上是个人喜好的问题。我将在此处提供一个 PHP 函数来执行此操作:

function group_data($data, $count) {
    usort($data, function ($a, $b) {
        return strcmp($a["date"], $b["date"]);
    });
    $result = [];
    $first = new DateTime($data[0]["date"]);
    $first->setTime(0, 0); // First group always starts at midnight
    $last = new DateTime($data[count($data)-1]["date"]);
    // Group size is always an integer number of hours:
    $hours = ceil(($first->diff($last)->days + 1) * 24 / $count);
    $group_interval = new DateInterval("PT{$hours}H");
    while ($count--) { // for each group
        $first->add($group_interval); // Increment the date with the fixed group size
        $date = $first->format('Y-m-d H:i:s');
        // Accumulate the values in the data that precede this date/time:
        $value = 0;
        while (current($data) && current($data)["date"] < $date) {
            $value += current($data)["value"];
            next($data); // Move to the next record
        }
        // Append this group to the result
        $result[] = ["id" => count($result)+1, "value" => $value, "date" => $date];
    }
    return $result;
}

这是一个如何使用它的例子。我假设您已经从数据库中选择了数据并将其放入关联数组中:

$data = [
    ["id" => 1, "value" => 12, "date" => "2017-01-23 00:13:12"],
    ["id" => 2, "value" => 54, "date" => "2017-01-23 08:33:23"],
    ["id" => 3, "value" => 45, "date" => "2017-01-23 09:01:57"],
    ["id" => 4, "value" => 94, "date" => "2017-01-22 05:17:15"],
    ["id" => 5, "value" => 67, "date" => "2017-01-22 10:12:44"],
    ["id" => 6, "value" =>  3, "date" => "2017-01-22 22:56:54"],
    ["id" => 7, "value" => 44, "date" => "2017-01-22 23:27:55"],
    ["id" => 8, "value" => 19, "date" => "2017-01-21 15:02:23"],
    ["id" => 9, "value" =>  8, "date" => "2017-01-21 00:14:54"],
];

// Use the function to divide the data into 12 equally sized groups    
$result = group_data($data, 12);

运行上述示例后,$result 变量将具有以下数据:

[
    ["id" =>  1, "value" =>  8, "date" => "2017-01-21 06:00:00"],
    ["id" =>  2, "value" =>  0, "date" => "2017-01-21 12:00:00"],
    ["id" =>  3, "value" => 19, "date" => "2017-01-21 18:00:00"],
    ["id" =>  4, "value" =>  0, "date" => "2017-01-22 00:00:00"],
    ["id" =>  5, "value" => 94, "date" => "2017-01-22 06:00:00"],
    ["id" =>  6, "value" => 67, "date" => "2017-01-22 12:00:00"],
    ["id" =>  7, "value" =>  0, "date" => "2017-01-22 18:00:00"],
    ["id" =>  8, "value" => 47, "date" => "2017-01-23 00:00:00"],
    ["id" =>  9, "value" => 12, "date" => "2017-01-23 06:00:00"],
    ["id" => 10, "value" => 99, "date" => "2017-01-23 12:00:00"],
    ["id" => 11, "value" =>  0, "date" => "2017-01-23 18:00:00"],
    ["id" => 12, "value" =>  0, "date" => "2017-01-24 00:00:00"],
]

关于javascript - 如何动态生成图表的日期/时间值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48121914/

相关文章:

javascript - jQuery 不会在调整大小时更改高度属性

javascript - 如何从文档和窗口中删除 JavaScript 触摸事件处理程序?

mysql - MVCC 如何与 MySql 中的 Lock 一起工作?

javascript - 增强对象类

javascript - 每次打开页面时都会显示 onmouseover 文本

php - 如何识别点击的div。查询

php - 我可以在 PHP 的函数中使用常量吗?

php - 使用 php 显示来自 postgresql 的图像(bytea)

mysql - Orika Mapper + Gson (JSON) + MySQL 的异常

php - mysql LIKE 双百分比