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

    转自http://www.xuebuyuan.com/212359.html

    背景:近日进行大型数据表的迁移处理,遭遇创建 主键时 索引键值重复的错误。仔细检查原始表,并未有任何问题。分析后发现是迁移数据的算法中,根据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' 来表达一天内的时间范围。

  • 相关阅读:
    [cf621E]Wet Shark and Blocks
    [学习笔记]数论
    [CZYZ2016]day8
    Python 对 Excel 操作用法详解
    HTML学记笔记
    Django 2.2_错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
    Python在终端通过pip安装好包以后,在Pycharm中依然无法使用的解决办法
    div的移动特效
    jQuery各种动画效果
    jqZoom插件
  • 原文地址:https://www.cnblogs.com/password1/p/6994601.html
Copyright © 2011-2022 走看看