mysql 统计本周7天的数据并分组
今天写到项目的一个数据展示模块,最终要呈现的效果是用柱状图显示本周七天的访客数量,所以要给前端本周7天的数据
比如今天是周二(实际上也是),我们要给前端周一周二的数据,后面周三到周日因为还没到,数据置0
在网上找了一些相关信息,都是用sql语句直接查询最近七天的数据的方法,这样导致一个问题,我们再假设今天是周二,那么统计的就是上周二到今天的数据,然而我实际上并不需要上周的数据
这里说一下我自己的解决方法,首先我们了解一下mysql的DATEDIFF方法,它会返回两个date数据之间的天数,比如DATEDIFF('2019-8-13' , '2019-8-14'),返回的结果是1
于是我们先写一个函数
@Select("SELECT count(id) FROM strange_record WHERE DATEDIFF( date_format( now( ) , '%Y-%m-%d' ) , date_format( time, '%Y-%m-%d' ) ) = #{day}") int getStrangeNumBeforeSomeDays(int day);
如果参数day=1,函数将返回1天前的数据统计值
然后我们获取今天是周几
public static int getWeekday(){ Date today = new Date(); Calendar c = Calendar.getInstance(); c.setTime(today); int weekday=c.get(Calendar.DAY_OF_WEEK); if(weekday==1) return 7; else return weekday-1; }
一般来说,到weekday这里,已经是java常用的获取当前日期的星期数的方法了,但是java中返回的1是周日,以此类推,7是周六,按照我们自己的习惯,我进行了一下改动,1-7分别表示周一到周日
然后是一个简单的数据处理
@Override public Map<String, Object> getStrangeNumCurWeek() { Map<String, Object> data = new HashMap<>(); for(int i=1;i<=7;i++){ data.put(String.valueOf(i),0); } int weekday = DateTimeUtil.getWeekday(); for(int i=1;i<=weekday;i++){ data.put(String.valueOf(i),monitorIndexDao.getStrangeNumBeforeSomeDays(weekday-i)); } return data; }
最后呈现的效果就是这样的