注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一线天色 天宇星辰

天下武功,唯快不破

 
 
 

日志

 
 

惨痛教训,SqlServer时间精度问题(解密23:59:59.999错误之处)  

2010-12-31 15:25:13|  分类: 软件开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    最近项目接近上线,首页上面有一个查询某一天消费记录的表格,于是我写了一个时间工具类,定义一个日期,比如现在是20101231 14:40:51,我要昨天的消费记录,那我就取他的日期2010-12-31然后将时间减去一天段截取为2010-12-30 0:00:00.0002010-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 数据,必须对明确提供的毫秒值加倍小心。

再次请求DBA和核查相关资料,终于明白,对于之前写的一篇文章 自己写的一个日期工具类(上) Java里面对于Date类型是精确的,而SqlServer是精度是3.33,因此Java这种写法是正确的,但是如何也使得SqlServer也正确的呢?计较官方的做法是不用等于或者使用between and

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();

}

  评论这张
 
阅读(148718)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017