Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP图表-用值填充缺少的日期_Php_Mysql_Sql_Date_Charts - Fatal编程技术网

PHP图表-用值填充缺少的日期

PHP图表-用值填充缺少的日期,php,mysql,sql,date,charts,Php,Mysql,Sql,Date,Charts,我目前正在制作一个图表,显示我相对于相应日期的预算 所有事务都存储在SQL数据库中 我使用以下SQL查询提取每个日期的每日pd总额: 这给了我一个如下的结果: +------------+--------+ | date | pd | +------------+--------+ | 2017-11-25 | 4.89 | | 2017-12-01 | 90.00 | | 2017-12-02 | -40.00 | +------------+--------+ 现

我目前正在制作一个图表,显示我相对于相应日期的预算

所有事务都存储在SQL数据库中

我使用以下SQL查询提取每个日期的每日pd总额:

这给了我一个如下的结果:

+------------+--------+
|    date    |   pd   |
+------------+--------+
| 2017-11-25 | 4.89   |
| 2017-12-01 | 90.00  |
| 2017-12-02 | -40.00 |
+------------+--------+
现在,我想让它看起来像这样:

+------------+--------+
|    date    |   pd   |
+------------+--------+
| 2017-11-25 | 4.89   |
| 2017-11-26 | 0.00   |
| 2017-11-27 | 0.00   |
| 2017-11-28 | 0.00   |
| 2017-11-29 | 0.00   |
| 2017-11-30 | 0.00   |
| 2017-12-01 | 90.00  |
| 2017-12-02 | -40.00 |
+------------+--------+
var ctxL = document.getElementById("chart_all_transactions").getContext('2d');
var myLineChart = new Chart(ctxL, {
    type: 'line',
    data: {
        labels: [
            <?php
                foreach($results as $value) {
                    $transaction_chart_date = date("d.m.Y", strtotime($value["date"]));
                    echo '"'.$transaction_chart_date.'"'.",";
                }
            ?>
],
        datasets: [
            {
                label: "Budget",
                fillColor: "rgba(220,220,220,0.2)",
                strokeColor: "rgba(220,220,220,1)",
                pointColor: "rgba(220,220,220,1)",
                pointStrokeColor: "#fff",
                pointHighlightFill: "#fff",
                pointHighlightStroke: "rgba(220,220,220,1)",
                data: [
                    <?php
                    $interim = 0;
                    foreach($results as $value) {
                        $interim += $value["pd"];
                        echo $interim.",";
                    }
                    ?>
                ]

            }
        ]
    },
    options: {
        responsive: true
    }    
});
如果有一天没有交易,我希望每天的pd总金额为0,因为账户上没有任何变动

有什么SQL方法可以做到这一点吗?或者,如果不需要额外的SQL计算时间使web应用程序变得更平滑,那么使用PHP进行操作会更明智吗

如果是这样的话,你知道我如何在PHP中做到这一点吗

我的图表代码如下所示:

+------------+--------+
|    date    |   pd   |
+------------+--------+
| 2017-11-25 | 4.89   |
| 2017-11-26 | 0.00   |
| 2017-11-27 | 0.00   |
| 2017-11-28 | 0.00   |
| 2017-11-29 | 0.00   |
| 2017-11-30 | 0.00   |
| 2017-12-01 | 90.00  |
| 2017-12-02 | -40.00 |
+------------+--------+
var ctxL = document.getElementById("chart_all_transactions").getContext('2d');
var myLineChart = new Chart(ctxL, {
    type: 'line',
    data: {
        labels: [
            <?php
                foreach($results as $value) {
                    $transaction_chart_date = date("d.m.Y", strtotime($value["date"]));
                    echo '"'.$transaction_chart_date.'"'.",";
                }
            ?>
],
        datasets: [
            {
                label: "Budget",
                fillColor: "rgba(220,220,220,0.2)",
                strokeColor: "rgba(220,220,220,1)",
                pointColor: "rgba(220,220,220,1)",
                pointStrokeColor: "#fff",
                pointHighlightFill: "#fff",
                pointHighlightStroke: "rgba(220,220,220,1)",
                data: [
                    <?php
                    $interim = 0;
                    foreach($results as $value) {
                        $interim += $value["pd"];
                        echo $interim.",";
                    }
                    ?>
                ]

            }
        ]
    },
    options: {
        responsive: true
    }    
});
因此,对于每个标签日期,都有一个对应的数据集pd。如果我使用PHP生成缺失日期标签并将其插入数组中,那么数据集如何知道金额对应的日期

如果你们中有人知道解决这个问题的SQL或PHP方法,那就太棒了

感谢您的帮助


提前谢谢

一种方法是使用查找一个月的结束日期,并将这些日期预填充为零值。编写一个小代码来查找范围内的所有日期,如果数据存在,则对它们进行排序。

在我看来,在数据库级别执行此操作将更加复杂。此外,它还意味着在数据库和应用程序之间移动额外的无意义数据。所以,我会用php来做这件事。如果有$startDate和$endDate,则可以循环它们之间的所有日期。例如,在javascript的data属性中,可以编写如下内容:

$interim = 0;
$i = 0;
$date = $startDate;
while($date <= $endDate){
    if($i < count($results) && strtotime($results[$i]["date"]) == $date){
        $value = $results[$i]["pd"];
        $i++;
    } else {
        $value = 0;
    }
    $interim += $value;
    echo $interim;

    $date = $date + 24*60*60
}
我认为最好先创建一个日期值字典,这样就不必依赖于按日期排序的行,图表中的代码看起来会更整洁一些,但仍然可以这样工作。

我使用SQL解决了这个问题

请注意,这不是最好的解决方案。PHP解决方案在处理和CPU时间方面会快得多。查询完成了它的工作,但是性能不是很好

查询:

SELECT c.mydate AS alldate, SUM( IF( t.account LIKE :acc, COALESCE( ROUND( t.amount, 2 ) , 0 ) , 0 ) ) AS pd
FROM calendar c
LEFT JOIN money_transactions t ON t.date = c.mydate
WHERE c.mydate >= STR_TO_DATE(  "2013-12-01",  "%Y-%m-%d" ) 
AND c.mydate <= ( 
SELECT MAX( c.mydate ) 
FROM calendar c
JOIN money_transactions t ON t.date = c.mydate ) 
GROUP BY c.mydate
ORDER BY c.mydate

是的,反正我也会这么做