mysql按天统计的时候,该天没有数据也要统计为0
网上很多方法都是在mysql里面处理的,但我发现在mysql里面处理的这种方式可能会因为你的where条件导致查出来的数据并没有补上0。既然现在又遇到了,前端又不想处理,那我就在取出数据之后做处理吧。
没有多难就是比较常规的思路,就是把没有数据的那几天数据补0。但是你要算出哪些日期是没有数据的,要把数据填充到数组里面。例如,2021-12-01、2021-12-05、2021-12-07、2021-12-08这组数据,就要把中间空的03、04、06这些数据都填补上去,记住还不能重复。
在我没有处理数据之前是这样的,处理之后是这样的
下面贴上代码
//补差天数统计数据($startTime是开始时间戳,比如是2021-12-01,但是我们表里查出的$info数据是从2021-12-07才开始有数据)
public function addArrayData($startTime, $info)
{
$list = [];
foreach ($info as $k => $v) {
//补全在查到有日期的数据前空出来的日期数据
if (strtotime($v['days']) - $startTime != 0 && $k == 0) {
$days = intval((strtotime($v['days']) - $startTime) / 86400);
for ($i = 0; $i < $days; $i++) {
$list[] = [
'total_nums' => 0,
'days' => date('Y-m-d', $startTime + (86400 * $i)),
];
}
}
$list[] = [
'total_nums' => round($v['total_nums'], 2),
'days' => $v['days']
];
//判断距离下一个有数据的日期距离现在多少天,然后把这些空日期都补上
if (!empty($info[$k + 1]) && intval((strtotime($info[$k + 1]['days']) - strtotime($v['days'])) / 86400) > 1) {
$diffDays = intval((strtotime($info[$k + 1]['days']) - strtotime($v['days'])) / 86400);
for ($i = 1; $i < $diffDays; $i++) {
$list[] = [
'total_nums' => 0,
'days' => date('Y-m-d', strtotime($v['days']) + (86400 * $i)),
];
}
}
}
return $list;
}