从查询中获取所有月份,包括零计数

时间:2018-12-17 08:20:12

标签: php mysql sql datetime mysqli

我现在有这个查询:

SELECT DATE_FORMAT(`dataNl`, \'%Y%m\') AS `Ym`, COUNT(*) AS `totale`
FROM `noleggio`
GROUP BY `Ym`

这有助于获取每个月的数据,但是如果一个月的值为0,则该值在数据库中不存在,因此无法获取。我需要一个查询来添加将COUNT字段设置为0的剩余月份。

我制作了一个PHP代码,将数值为0的月份添加到数组中,但是仅当年份只有一年时才有效,如果我想获得更多,这需要很多棘手的代码,我认为可能会有一个SQL解决方案。

这是PHP代码:

$t = array();
$m = array();
foreach ($months as $val) {
    $t[] = $val['totale'];
    $m[] = $val['Ym'];
}

for ($i = 0; $i < 12; ++$i) {
    if (in_array($i + 201801, $m) == false) {
        array_splice($t, $i, 0, 0);
    }
}

2 个答案:

答案 0 :(得分:1)

这是一个PHP解决方案,需要数据库中的最小日期和最大日期:

// use the query SELECT MIN(dataNl), MAX(dataNl) FROM ... to
// find the first and last date in your data and use them below
$dates = new DatePeriod(
    DateTime::createFromFormat('Y-m-d|', '2018-01-15')->modify('first day of this month'),
    new DateInterval('P1M'),
    DateTime::createFromFormat('Y-m-d|', '2018-12-15')->modify('first day of next month')
);

// assuming $rows contain the result of the GROUP BY query...
foreach ($dates as $date) {
    $datestr = $date->format('Ym');
    $index = array_search($datestr, array_column($rows, 'Ym'));
    if ($index === false) {
        echo $datestr . ' -> 0' . PHP_EOL;
    } else {
        echo $datestr . ' -> ' . $months[$index]['totale'] . PHP_EOL;
    }
}

答案 1 :(得分:0)

请尝试以下查询:

SELECT DATE_FORMAT(`dataNl`, \'%Y%m\') AS `Ym`, COUNT(*) AS `totale`
FROM `noleggio`
GROUP BY MONTH(`dataNl`)