mysql 补全日期_MySQL查询一段时间内的数据,没有数据的日期补全0

本文介绍了如何在MySQL中查询一段时间内的数据,并在没有数据的日期填充为0。包括查询每天和每月的数据,通过创建临时表结合CASE语句进行统计。详细解释了各个参数的作用,如日期间隔、临时表创建、条件过滤等。
摘要由CSDN通过智能技术生成

一、查询每天的数据,没有数据的那天,补全0:

SELECT

dateTime,

MAX( success ) AS success,

MAX( fail ) AS fail

FROM

(

SELECT

@cdate := DATE_ADD( @cdate, INTERVAL - 1 DAY ) dateTime,

0 AS success,

0 AS fail

FROM

( SELECT @cdate := DATE_ADD( #{date1}, INTERVAL + 1 DAY ) FROM table ) temp

WHERE

@cdate > #{date2} UNION ALL

SELECT

DATE_FORMAT( t1.create_time, '%Y-%m-%d' ) AS dateTime,

sum( CASE WHEN t1.status = 1 THEN 1 ELSE 0 END ) AS success,

sum( CASE WHEN t1.status != 1 THEN 1 ELSE 0 END ) AS fail

FROM

table t1

LEFT JOIN table2 t2 ON t1.id = t2.t1_id

WHERE

t1.create_time >= #{date3}

and t1.create_time <= #{date4}

GROUP BY

DATE_FORMAT( t1.create_time, '%Y-%m-%d' )

) tempAllTable

GROUP BY

dateTime

ORDER BY

dateTime DESC

查询结果展示:

d4061bb93299df9eecf315f7b420c848.png

#{date1} 该字段为创建临时表的起始时间。DATE_ADD(date,INTERVAL expr type)INTERVAL +1 DAY表示起始日期添加1天。

*创建临时表,是以业务表为基础创建的临时表。例子中message_record有很多数据,是为了省事创建。如果业务表没有数据,这里创建日期临时表为空。如果只有10条数据,那么临时表中也只有10条数据。

select [email protected] := DATE_ADD( @cdate, INTERVAL - 1 DAY ) dateTime 表示从临时表中查询每次减1天的日期。

#{date2} 该字段为临时表查询的截止日期,即每次减1天,到#{date2}日期截止。

#{date3}、#{date4} 为业务表中判断时间段的起始和结束时间。

一般情况补全天的话。临时表起始日期#{date1} = 业务表截止日期#{date4}  。临时表截止日期#{date2} = 业务表起始日期#{date3}。

success和fail数据是根据状态做的分类统计。如果不需要分类,只需要统计数量,这里可以替换count()函数

二、查询每月的数据,没有数据的月份,补全0:

SELECT

dateTime,

MAX( success ) AS success,

MAX( fail ) AS fail

FROM

(

SELECT

DATE_FORMAT( @cdate := DATE_ADD( @cdate, INTERVAL - 1 MONTH ), '%Y-%m' ) dateTime,

0 AS success,

0 AS fail

FROM

( SELECT @cdate := DATE_ADD( #{date1}, INTERVAL + 1 MONTH ) FROM table LIMIT #{limit}) temp

UNION ALL

SELECT

DATE_FORMAT( t1.time_create, '%Y-%m' ) AS dateTime,

sum( CASE WHEN status = 1 THEN 1 ELSE 0 END ) AS success,

sum( CASE WHEN status != 1 THEN 1 ELSE 0 END ) AS fail

FROM

table t1

LEFT JOIN table t2 mr ON t1.id = t2.t1_id

WHERE

t1.time_create >= #{date2}

AND t1.time_create <= #{date3}

GROUP BY

DATE_FORMAT( t1.time_create, '%Y-%m' )

) tempAllTable

GROUP BY

dateTime

ORDER BY

dateTime DESC

查询结果展示:

efffc92bce4936a04b4075833984dc21.png

#{date1} 类似于查询天中的起始时间,时间间隔为 1 MONTH。

#{date2}、#{date3}为业务表查询比较日期。

#{limit} 为查询结果中限制数量。这个条件也可以在查询天的SQL中添加。这里添加#{limit}是为了查询月数据准确。不加limit,[email protected]< #{date} 的话,这里比较的是天。但是临时表计算日期是INTERVAL -1 MONTH。如图:

1e158eeb8ea24c23ccc872731535e1c8.png

02df3c63400e89b51a27823e1e8646b6.png

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值