记第一次使用SimpleDateFormat时的场景------------------------------------------------
表rbw_geo_data:
业务场景:原本的时间轴接口是一个实现根据输入的id,(即date_type_id,对应的是数据类型)来获取数据,并且按时间的年、月、旬进行排序。现在要添加一个筛选功能,可以在原来的数据中筛选某一年某一月到另一年另一月的数据。
思路:这个接口中有两个功能,一个是根据Id获取数据,另一个是在第一个的基础上进一步筛选数据,所以会有两种返回结果,一种是前端传入的参数只有id时,返回第一种功能的数据,另一种是,传入的参数有id,有时间(年月)。参数的有无作为逻辑判断条件。
实现代码如下:
public Ret getLayerByDate(Integer id,String[] time) {
if (id == null) {
return Ret.fail("errorMsg", "请选择数据类型");
}
if (id != null && time == null) {
List<Record> year_month_ten_day = Db.find("select * from rbw_geo_data where data_type_id = ? order by year,month,ten_day", id);
return Ret.ok("data", year_month_ten_day);
}else if (time != null) {
SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
try {
Date beginTime = sm.parse(time[0]+"-02");//这里的02是因为数据库有一些数据的开始时间是上一条数据的结束时间,01查出来数据会多出一条,只要避开01就ok
Date endTime = sm.parse(time[1]+"-21");//因为前端传入的是年月,没有日,我们要得到的效果是传入7月到8月,返回这两个月的数据,所以拼上生效的日期,就能拿到一样效果的数据
List<Record> year_month_ten_day_ym = Db.find("select * from (select * from rbw_geo_data where data_type_id = ? order by year,month,ten_day)a"+
" where begin_time <= ? and end_time >= ?",id,endTime,beginTime);
return Ret.ok("data", year_month_ten_day_ym);
} catch (ParseException e) {
e.printStackTrace();
}
}
return Ret.ok();
}
- 关于sql的思考:因为筛选功能是在第一个查询结果的基础上进行的,所以可以以第一个sql的查询结果作为临时表去查满足时间段内的数据。
- 关于sql判断条件的思考:怎么判断这条数据是否在这个时间段中,即,开始时间begin_time<=时间段的结束时间 and end_time >=时间段的开始时间,那么就可以查到这条数据。
- SimpleDateFormat的用法:
(1)SimpleDateFormat是一个与语言环境相关的格式化日期和分析日期的工具类,利用该类可以将日期转换成文本,或者将文本转换成日期。
在使用SimpleDateFormat时需要指定一个你需要的格式(pattern)来格式日期Date.
- SimpleDateFormat中parse()方法小结:
parse()方法的作用时将文本转换为日期Date,parse()方法的输入参数是一个文本,比如String,例如:
private void test2() {
try {
String day = "2008年08月18日 20:07:33";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.getDefault());
Date date = simpleDateFormat.parse(day);
System.out.println("----> 格式化后的日期为: "+date);
} catch (Exception e) {
System.out.println("----> Exception: "+e.toString());
}
}
- 关于时间格式的实战及思考:
我刚开始设置的格式是yyyy-MM,前端传入的参数也是年月,发现返回的数据是不符合要求的,然后再设置成yyyy-MM-dd,刚开始传入年月,运行报错传入的参数不认识,进一步在navicat中测试sql语句,年月日查询出来是正确的数据,因此我们只需要在前端传入的年月,拼上能查询出正确结果的日期进行查询即可。
综合考虑:需要注意的是sql需要结合实际数据进行编写,多测数据,保证写的sql适用所有数据。
附:关于SimpleDateFormat的详细用法参考下列文献:
参考文献:SimpleDateFormat 的使用及其 注意事项_怪咖先森的博客-CSDN博客_simpledateformat用法