数据库表
业务场景:我们需要展示除当天以外的所有日期的aqi平均值,保留小数点后两位,时间是字符串类型,城市是固定的一个,不考虑加入到where条件。
代码如下:
public void reaTimeLevel() { Ret result = Ret.ok("state", "ok"); List<Record> dataList = Db.use("upms").find("select sum(aqi)/24 as saqi,str_to_date(date,'%Y%m%d ') as date,year(str_to_date(date,'%Y%m%d ')) as ayear,LPAD(month(str_to_date(date,'%Y%m%d')),2,0)asamonth,LPAD(day(str_to_date(date,'%Y%m%d ')),2,0) as aday from td_atomsphere where str_to_date(date,'%Y%m%d ') < date_sub(now(),INTERVAL 1 day) group by date"); //now(),INTERVAL 1 day 0表示当天 1表示前一天 //LPAD(参数,长度,补什么)可以在截取的单数日期比如8补为08 List<Record> recordList = new ArrayList<>(); for (Record record : dataList) { List<String> months = new ArrayList<>(); List<String> days = new ArrayList<>(); List<String> years = new ArrayList<>(); Double avg = Double.valueOf(record.getStr("saqi")); avg = (double) Math.round(avg * 100) / 100;//保留小数点后两位 months.add(record.getStr("amonth")); days.add(record.getStr("aday")); years.add(record.getStr("ayear")); Record data = new Record(); data.set("months", months); data.set("days", days); data.set("years", years); data.set("avgs", avg); recordList.add(data); } renderJson(Co.ok("data", result.set("data", recordList))); }
需要用到的知识点:
一、Mysql中字符串转日期:
select str_to_date(date,'%Y%m%d ') date 日期 varchar '%Y%m%d ' 转化为日期的格式
二、日期截取年月日:
year(日期) as ayear 表示 截取月月日中的年
三、补全日期,比如1月 改成01月 9日改为09日 即单数的月,日要补0:
LPAD(参数,长度,补什么)可以在截取的单数日期比如8补为08
四、核心知识点---- 查询出当天以外的数据:
select xxx from 表名 where 日期 < date_sub(now(),INTERVAL 1 day)
date_sub(now(),INTERVAL 1 day) 1 表示的日期是前一天 0 表示当天 now() 现在的时间戳
五、保留小数点后两位:
Double avg = 23.375
(double) Math.round(avg * 100) / 100 结果 为 23.38
关于小数点保留问题 参考文献 Java中Double保留后小数位的几种方法 - 的川 - 博客园