数据库表

 

业务场景:我们需要展示除当天以外的所有日期的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保留后小数位的几种方法 - 的川 - 博客园

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐