我目前有这个查询:
SELECT
MONTHNAME(TIME) AS month,
YEAR(time) AS year,
COUNT(id) AS COUNT
FROM
appointment
WHERE
dealershipid = '38' && dealerstatus != 'No-Show' && TIME >= DATE_ADD(NOW(), INTERVAL - 12 MONTH)
GROUP BY
MONTH(TIME)
ORDER BY
`time` ASC
这是为了返回过去12个月中每个月的约会记录总数(滚动12个月,而不是1-12,可能是Feb19-Mar20)
这实际上是返回的内容:
+-----------+------+-------+--+
| month | year | COUNT | |
+-----------+------+-------+--+
| July | 2019 | 1 | |
| August | 2019 | 2 | |
| September | 2019 | 8 | |
| October | 2019 | 9 | |
| November | 2019 | 15 | |
| December | 2019 | 2 | |
| January | 2020 | 4 | |
| February | 2020 | 2 | |
+-----------+------+-------+--+
我以为一切都很好,但(例如)2020年2月实际上有13个任命,而不是规定的2个。
这是一个包含数据和查询的数据库小提琴:
https://www.db-fiddle.com/f/pndaShANmnLZRXxNNe3GPk/1
编辑:
显然,受影响的唯一结果是2月(当月),因此查询的NOW()函数不会获取整个月,而不是现在之前的任何内容。
答案 0 :(得分:1)
问题是将来的约会没有演出。您的查询会过滤出NULL
个值。
尝试一下:
SELECT MONTHNAME(time) AS month,
YEAR(time) AS year,
COUNT(id) AS COUNT
FROM appointment
WHERE dealershipid = '38' AND
not dealerstatus <=> 'No-Show' AND
time >= (CURDATE() + INTERVAL (1 - DAY(CURDATE())) DAY) - INTERVAL 12 MONTH AND
time < (CURDATE() + INTERVAL (1 - DAY(CURDATE())) DAY) + INTERVAL 1 MONTH
GROUP BY YEAR(Time), MONTH(time)
ORDER BY MAX(time) ASC;
我还更改了日期/时间逻辑,因此它仅包含一年中的完整月份。如果希望当前月份为部分月份,则可以改回。
Here是小提琴。
答案 1 :(得分:1)
您的问题在这里:
dealerstatus != 'No-Show'
这不包括其他经销商状态和空值。
你想要
(dealerstatus != 'No-Show' OR dealerstatus IS NULL)
相反。
完整的更正查询:
SELECT
MONTHNAME(MAX(time)) AS month,
YEAR(time) AS year,
COUNT(*) AS count
FROM appointment
WHERE dealershipid = 38
AND (dealerstatus <> 'No-Show' OR dealerstatus IS NULL)
AND time >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 YEAR
GROUP BY YEAR(time), MONTH(time)
ORDER BY YEAR(time), MONTH(time);
(您的查询也无效。我已经完成了GROUP BY
子句并添加了MAX
,最好是ANY_VALUE
,但是您的旧MySQL版本不支持它。我还更改了日期标准,以免获得上月的日期。不知道您是否愿意。