最近项目接近上线,首页上面有一个查询某一天消费记录的表格,于是我写了一个时间工具类,定义一个日期,比如现在是2010年12月31日 14:40:51,我要昨天的消费记录,那我就取他的日期2010-12-31然后将时间减去一天段截取为2010-12-30 0:00:00.000和2010-12-30 23:59:59.999,然后加上一个很简单的Sql--createTime>=beginTime and createTime<=endTime(实际SQL为 createTime>=2010-12-30 0:00:00.000 and createTime<=2010-12-30 23:59:59.999),一查询,很奇怪的事情是 查询结果将2010-12-31 0:00:00的消费记录也查出来了,我还以为是我用的框架Ibatis的问题,将对应的Sql语句拷贝到sqlServer里面执行一把,结果依然。我就傻眼了,为啥呢?怎么可能出现这种问题?百思不得其解,查看以前别人写的代码,他们使用的生成值不是23:59:59.999而是23:59:59.998,我试了一下,果然998的可以,查出来的结果是正确的,于是乎,百度一把,原来是这样:
datetime 数据无法保证毫秒级别的精度。datetime 数据的精度在 3.33 毫秒内。使用 23:59:59.999 这个确切的时间值是不行的,因为该值将被舍入到最接近的时间值,即第二天的 0:00:00.000 。由于进行了这种舍入,将无法正确定义边界。对于 datetime 数据,必须对明确提供的毫秒值加倍小心。
public static final Date totalConvertTime(Date fullDate){
Calendar cal = Calendar.getInstance();
cal.setTime(fullDate);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
return cal.getTime();
}
评论