在日期范围内使用SUM和GROUP BY时如何在空结果上返回零

时间:2018-07-31 20:11:00

标签: mysql

我有一个类似于以下内容的mySQL查询:

SELECT dtStartTime
     , SUM(TIMESTAMPDIFF(MINUTE,dtStartTime,dtStopTime)) AS thisTimer 
FROM tblTimers 
WHERE dtStartTime BETWEEN '2018-01-01' AND '2018-12-31' 
GROUP BY YEAR(dtStartTime), MONTH(dtStartTime)

该查询应该获取2017年1月1日至2018年12月31日之间每个月所有计时器的总分钟数。这样做很好。但是,它不会在没有计时器的情况下连续几个月返回。

当前它输出类似:

dtStartTime........ | thisTimer
2018-02-14 09:25:59 | 661
2018-03-27 13:46:00 | 98
2018-05-07 09:24:22 | 633
2018-06-10 06:59:10 | 87
2018-11-10 12:10:52 | 318
2018-12-02 09:16:33 | 804

但是我希望它输出更多类似的内容:

thisMonth. | thisTimer
2018-01-01 | 0
2018-02-01 | 661
2018-03-01 | 98
2018-04-01 | 0
2018-05-01 | 633
2018-06-01 | 87
2018-07-01 | 0
2018-08-01 | 0
2018-09-01 | 0
2018-10-01 | 0
2018-11-01 | 318
2018-12-01 | 804

我该怎么做?

1 个答案:

答案 0 :(得分:0)

为澄清起见,我从为简化问题而发布的示例中截断了许多级别的复杂性。虽然从我的角度来看,雷蒙德的链接从技术上来说是对这个问题的正确答案,但它却造成了各种各样的问题,试图使它在我的整个查询中正常工作,因为该肉类本身是如此复杂且文献记载不多。

Strawberry建议仅执行此应用程序级别的建议要简单得多,这可能是我建议大多数将来可能会发现此问题的人的方式。

尽管确切的解决方案随应用程序语言和所需的数据格式而有所不同,但这是一个简单的PHP解决方案,可以作为任何需要此解决方案的人的起点(您可能需要添加一个额外的循环用于一次查询超过一年会重置$ i的年份):

if ($timerQuery->num_rows > 0) {
    $i = 0;
    while($row = $timerQuery->fetch_assoc()) {
        $thisDate = strtotime($row['dtStartTime']); // Convert string to php datetime.
        $thisMonth = date('n',$thisDate); // get month value
        if($i < 12){ 
            $i ++;
            While ($thisMonth != $i && $i <= 12) {
                $strMonths .= "0, "; // add empty value for missing months.
                $i ++;
            }
            if ($thisMonth == $i){
                $strMonths .= $row['thisTimer']. ", "; // add next recorded month's value.
            }
        } 
    }
    $strMonths = rtrim($strMonths, ', '); // remove trailing comma.
} else {
    $ctyr = "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0";
}
echo $ctyr;