Mysql查询一段时间内数据,空数据默认为0


此文章共分为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>        

  完结撒花🎉

    

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM