我有一个类似于以下内容的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
我该怎么做?
答案 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;