Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
// 将小时至0
calendar.set(Calendar.HOUR_OF_DAY, 0);
// 将分钟至0
calendar.set(Calendar.MINUTE, 0);
// 将秒至0
calendar.set(Calendar.SECOND, 0);
Date timestamp = calendar.getTime();
Map<String,Object> params = ContentValues.obtain().put("timestamp",timestamp).getValues();
List<Map<String, Object>> records= recordMapper.queryRecordsByTimestamp(parmas);
@Query("select id,name,size from t_opration_recoreds where timestamp >= #{timestamp}")
List<Map<String,Object>> queryRecordsByTimestamp(Map<String,Object> paramMap);
上面的代码逻辑为查询昨天和今天的操作记录 看起来没有任何问题 查询结果可能也没问题
但当有数据timestamp是昨天0点0分0秒0毫秒时 而calendar是01毫秒时创建的 那这条数据时查询不出来的 因为mybatis参数是date时 毫秒是会参与比较的 以下为查询时mybatis的日志
- ==>Preparing: select id,name,size from t_opration_recoreds where timestamp >= ?
- ==> Parameters: 2020-03-23 00:00:00.135(Timestamp)
- <== Total: 2822
timestamp的cdate.toString为 2020-03-23T08:00:00.135+0800
然而实际条数是2823条 查看日志发现timestamp为2020-03-23 00:00:00.135 日期里有毫秒 而记录的timestamp为2020-03-23 00:00:00 肯定查询不到
解决办法
//方式一
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
// 将小时至0
calendar.set(Calendar.HOUR_OF_DAY, 0);
// 将分钟至0
calendar.set(Calendar.MINUTE, 0);
// 将秒至0
calendar.set(Calendar.SECOND, 0);
//毫秒至0
calendar.set(Calendar.MILLISECOND,0);
//方式二 共用考虑线程安全
date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-03-23");