PHP图表-用值填充缺少的日期
我目前正在制作一个图表,显示我相对于相应日期的预算 所有事务都存储在SQL数据库中 我使用以下SQL查询提取每个日期的每日pd总额: 这给了我一个如下的结果: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 | +------------+--------+ 现
+------------+--------+
| 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
是的,反正我也会这么做