此文章共分为5部分:
1、需求
2、第一步:数据表查询
3、第二步:日期表查询
4、第三步:时间表/数据表关联查询
5、第四步:使用mybatis动态控制查询日期区间
正文开始
需求:
查询一段时间内 每天数据量 ,没有数据默认为0
第一步:数据表查询
分组查询sql如下,查询 2020-12-20 ~ 2020-12-25 区间数据:
select count(*) count,DATE_FORMAT(ride_time,'%Y-%m-%d') ride_time from tab_visitor_ride_record where ride_time >= DATE_FORMAT('2020-12-20','%Y-%m-%d') and ride_time <= DATE_FORMAT('2020-12-25','%Y-%m-%d') group by DATE_FORMAT(ride_time,'%Y-%m-%d')
结果只会出现已有日期的数据:
以上结果显然是不符合需求的 ,那么就需要链接日期表进行关联查询
第二步: 日期表查询
日期表查询如下,需要指定开始日期以及查询日期天数
select date_add('2020-12-20',interval @i:=@i+1 day) as date from ( select 1 union all select 1 union all select 1 union all select 1 union all select 1 union all select 1 ) as tmp, (select @i:= -1) t
结果返回 2020-12-20~2020-12-25 区间所有日期:
第三步:时间表/数据表关联查询
使用左外联接查询:
select d.date, IFNULL(T.count,0) count from ( select date_add('2020-12-20',interval @i:=@i+1 day) as date from ( select 1 union all select 1 union all select 1 union all select 1 union all select 1 union all select 1 ) as tmp, (select @i:= -1) t ) d left join( select count(*) count,DATE_FORMAT(ride_time,'%Y-%m-%d') ride_time from tab_visitor_ride_record where ride_time >= DATE_FORMAT('2020-12-20','%Y-%m-%d') and ride_time <= DATE_FORMAT('2020-12-25','%Y-%m-%d') group by DATE_FORMAT(ride_time,'%Y-%m-%d') ) T on T.ride_time = d.date GROUP BY d.date
结果如下:
第四步:使用mybatis动态控制查询日期区间
首先要动态控制日期,就要知道范围内的日期个数,创建查询条件为数组:
private String[] days;
这里在service层计算:
//计算时间天数跨度 query.setDays(new String[(int) ((query.getEndTime().getTime() - query.getStartTime().getTime()) / (1000 * 60 * 60 * 24))]);
然后在mapper文件中通过foreach进行遍历:
<select id="select" resultMap="Vo"> select d.date, IFNULL(T.count,0) count from ( select date_add(DATE_FORMAT(#{startTime},'%Y-%m-%d'),interval @i:=@i+1 day) as date from ( select 1 <foreach item="index" collection="days"> union all select 1 </foreach> ) as tmp, (select @i:= -1) t ) d left join ( /** 你自己的业务逻辑 */ )T on T.date = d.date </select>
完结撒花🎉