zoukankan      html  css  js  c++  java
  • Sqlserver:datetime类型的精度(不确定性)问题

      背景:近日进行大型数据表的迁移处理,遭遇创建 主键时 索引键值重复的错误。仔细检查原始表,并未有任何问题。分析后发现是迁移数据的算法中,根据datetime类型的字段 使用 between and 逐渐获取每日的数据记录 进行迁移的。故而造成迁移后的表中出现重复记录。

      where datetime_field between '2010-11-01 00:00:00.000' and '2010-11-01 23:59:59:999'

      环境:sqlserver 2000

      微软官方文档:指明datetime类型的精度为 :千分之三秒(3.33毫秒、0.00333秒)。所有的datetime类型的值在显示、处理时 有所调整。即会圆整到几个特殊的毫秒个位值:0、3、7:如:(9、0、1) 会引起进0调整;(5、6、7、8)引起7调整;(2、3、4)引起3调整。

      分析:所以,如果使用了between and的where条件,就可能引起计算失误。

      where datetime_field between '2010-11-01 00:00:00.000' and '2010-11-01 23:59:59:999' 就相当于

      where datetime_field between '2010-11-01 00:00:00.000' and '2010-11-02 00:00:00:000' 这样,具有'2010-11-02 00:00:00:000'值的记录就会出现多次。

      解决:根据sqlserver的datetime圆整的特性,可以使用:

      where datetime_field between '00:00:00.000' and ' 23:59:59:998' 来表达一天内的时间范围。记住: ' 23:59:59:999'已经是下一天了。

      或者,使用:

      where datetime_field >= '00:00:00.000' and datetime_field < '下一日 00:00:00.000' 来表达一天内的时间范围。

  • 相关阅读:
    第一次团队作业
    第二次结对作业
    动态代理与AOP
    笔试题
    java并发面试题(带答案)
    线程问题——同步和死锁
    java线程的方法
    java实现多线程的方法
    使用java闭锁实现并发
    Java多线程——同步问题
  • 原文地址:https://www.cnblogs.com/jinzhenshui/p/1880981.html
Copyright © 2011-2022 走看看