关于日统计报表的问题(时间边界问题,查询条件)

it2026-01-10  8

最近做了一个日统计报表,一个非常简单的小查询,却引出了一些小问题,在这里记录一下:

1.首先是根据日期对每天进行数据统计
2.条件筛选时存在时间边界的问题

第一个问题

如何根据时间对数据进行每日的统计。首先,数据库有一张类似于下面的表–只关于时间 这样你就可以关联你所要统计的表的来进行按日统计。 这里我用到了几个点,可以注意一下:

1.对于当日数据为空的进行默认置零

2.关联时间表进行按日查询

3.对时间筛选条件进行边界处理

SELECT date_format(date,'%Y-%m-%d') as worktime, ifnull(pushmes.waitPush,0) as waitPush, ifnull(pushmes.pushFail,0) as pushFail, ifnull(pushmes.pushPlatform,'') as pushPlatform, ifnull(pushmes.pushSuccess,0) as pushSuccess from work_date LEFT JOIN (SELECT date_format(push_time,'%Y-%m-%d') as pushdates, push_platform as pushPlatform, sum(case push_result when -1 then 1 else 0 end) waitPush, sum(case push_result when 1 then 1 else 0 end) pushSuccess, sum(case push_result when 0 then 1 else 0 end) pushFail FROM loan_app_push <where> <if test="pushPlatform != null and pushPlatform != ''"> push_platform = #{pushPlatform} </if> <if test="startTime !=null and startTime!=''"> and push_time &gt;= DATE_FORMAT(#{startTime}, '%Y-%m-%d') </if> <if test="endTime !=null and endTime!=''"> and push_time &lt;= DATE_FORMAT(#{endTime}, '%Y-%m-%d 23:59:59') </if> </where> group by pushdates ) as pushmes on pushdate.pushdates = work_date.date <where> <if test="pushPlatform != null and pushPlatform != ''"> pushmes.pushPlatform = #{pushPlatform} </if> <if test="startTime !=null and startTime!=''"> and work_date.date &gt;= DATE_FORMAT(#{startTime}, '%Y-%m-%d') </if> <if test="endTime !=null and endTime!=''"> and work_date.date &lt;= DATE_FORMAT(#{endTime}, '%Y-%m-%d') </if> </where> order by work_date.date desc </select>

1.使用ifnull(pushmes.waitPush,0) as waitPush 对空字段进行置零操作,注意后面需要 重新as 一个新的字段名;

2.使用left join 对时间表及数据表进行关联,关联点为时间。这里讲数据表进行筛选过后生成一张临时数据表与时间表进行关联。

3.时间边界问题:这里用到了gt= 与lt= 大于小于等于,后面对时间进行格式化处理,但注意’%Y-%m-%d’格式化后默认的时间是当日时间的00:00:00,所以在endTime时,我们就要对其进行处理,手动更新时间为23:59:59,这样就可以查到结束日期那天的数据了。

4.另外补充一点,如果想要查询出每天的数据,没有数据的那天也要展示,那么最外面的筛选条件(时间表进行筛选)就起到了作用。

好了,暂时就这么多内容。

总结一下,要点:left join 、临时表、ifnull判断、date_format时间边界。

日拱一卒,得寸进尺。

最新回复(0)