项目中有些曲线图,需要统计月份每天的,或者年份每个月的条件数量
列如:
如下图mysql的表safety_camera_event有八条数据
1. 直接分组是得不到全部日期的,只能分组到有的日期数据
SELECT DATE_FORMAT(sce.event_date,'%Y-%m-%d') as date ,count(1) from safety_camera_event sce GROUP BY DATE_FORMAT(sce.event_date,'%Y-%m-%d')
结果:
2.我们想得到连续日期,并补0的数据需要这样来写
日的数据
SELECT t1.date_str, COALESCE(t2.date_total_count, 0) as date_total_count
FROM(
SELECT @cdate:= date_add(@cdate, interval - 1 day) as date_str FROM(SELECT @cdate:= date_add('2022-10-15', interval + 1 day) from security_role_resource) tmp1 WHERE @cdate > '2022-10-01'
) t1
LEFT JOIN(
SELECT DATE_FORMAT(sce.event_date, '%Y-%m-%d') as date_str, count(1) as date_total_count FROM safety_camera_event as sce WHERE sce.valid =1 AND
YEAR(sce.event_date) = YEAR(now())
AND
MONTH(sce.event_date) = MONTH(now()) GROUP BY DATE_FORMAT(sce.event_date, '%Y-%m-%d')
) t2
on t1.date_str = t2.date_str
ORDER BY t1.date_str ASC
结果:
同理月的数据:
SELECT t1.date_str, COALESCE(t2.date_total_count, 0) as date_total_count
FROM(
SELECT DATE_FORMAT(@cdate:= (date_add(@cdate, interval - 1 month)),'%Y-%m') as date_str FROM(SELECT @cdate:= date_add('2022-10-01', interval + 1 month) from security_role_resource) tmp1 WHERE @cdate > '2022-01-01'
) t1
LEFT JOIN(
SELECT DATE_FORMAT(sce.event_date, '%Y-%m') as date_str, count(1) as date_total_count FROM safety_camera_event as sce WHERE sce.valid =1 AND
YEAR(sce.event_date) = YEAR(now())
GROUP BY DATE_FORMAT(sce.event_date, '%Y-%m')
) t2
on t1.date_str = t2.date_str
ORDER BY t1.date_str ASC
结果: