转自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' 来表达一天内的时间范围。

Sqlserver:datetime类型的精度(不确定性)问题的更多相关文章

  1. 【转】SQL SERVER DateTime类型的精度

    先看下边的SQL 语句 CREATE TABLE #DateTest( Id INT, SampleDate DATETIME ) INSERT INTO #DateTest VALUES(1,'1 ...

  2. C# DateTime类型和sqlserver DateTime精度不同

    在最近的项目中, 有个关于时间的功能.一个请假的时间.前端选择的时候只有日期.所以比如请一天假就是选2017-8-15和2017-8-15,这样算请这一天的假.但是后台存入数据库时我不能就存2017- ...

  3. 解决Entity Framework中DateTime类型字段异常

    从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值 具体的错误原因是:C#中的DateTime类型比SqlServer中的datetime范围大.SqlServe ...

  4. [SQL]躺着也中枪的datetime类型

    写在前面 本来这个东西,我是不想在这里总结的,今天有初学者的朋友问我了,那就不得不说说了,你肯定也踩过这样的坑,没遇到,说明你运气好,编码习惯好.那还是言归正传吧.避免你中枪,还是扫一眼这篇文章吧. ...

  5. C# SQLite写入和读取DateTime类型

    很简单 1.不要相信网上大部分人说的话,比如存到int里 (ps:版本差距知道吗?) 2.nuget包下载最新版的sqlite 3.SQLite支持DateTime类型(图形化工具不会给提示无视它), ...

  6. MySQL datetime类型详解

    研发反馈问题,数据库中datetime数据类型存储的值末尾会因四舍五入出现不一致数据,影响查询结果,比如:程序中自动获取带毫秒精度的日期'2019-03-05 01:53:55.63',存入数据库后变 ...

  7. 【AspNetCore】【WebApi】扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat)

    扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat) 一.背景 大家在使用WebApi时,会用到DateTime为参数,类似于这 ...

  8. 用js解析经json序列化后的C#的DateTime类型数据

    格式化日期(网上到处是),把下面的代码添加到jQuery.js文件中 //格式化日期 Date.prototype.format = function(format) { /* * eg:format ...

  9. Convert.ToDateTime(值),方法可以把一个值转化成DateTime类型。

    例子:将日历控件的值转化成DateTime类型. DateTime beginDate = Convert.ToDateTime(this.beginCalendar.EditValue);

随机推荐

  1. go-003-基础语法

    1.行分隔符 一行代表一个语句结束. 如果一行多个,使用“;”分割,不推荐使用,建议使用默认一行一个语句 2.标识符 标识符用来命名变量.类型等程序实体.一个标识符实际上就是一个或是多个字母(A~Z和 ...

  2. python16_day40【数据结构】

    一.链表 #!/usr/bin/env python # -*-coding:utf8-*- __author__ = "willian" # 一.简单链表 class Node( ...

  3. idea中使用junit测试时使用Scanner类无法正常测试

    解决办法是:在main函数中测试方可有效. public static void main(String[] args){ Scanner sc = new Scanner(System.in);// ...

  4. 手游精品时代,iClap参会TFC高效解决手游问题

    随着“互联网+”概念的广泛应用,文娱类产品跨界融合的现象日益明显,不再以孤立的形态出现在市场中.移动游戏作为泛娱乐产业链的变现末端和关键环节,在传统游戏和VR/AR.HTML5.机器人.智能设备等新业 ...

  5. 5makefile

    makefile编译多个可执行文件1: 多个 C 文件编译成不同的目标文件2: 多个 C 文件编译成 一个目标文件 注意:makefile的文件名的三种形式(优先级排序)makefile>Mak ...

  6. EditPlus 4.3.2475 中文版已经发布(10月28日更新)

    新的修订版修复了上移多个插入点时会造成程序崩溃的问题.

  7. 【android】开发笔记系列:行为篇

    1:键盘遮挡了输入框 在androidManifest.xml里,对应的activity里设置键盘模式 <activity android:name="活动名称" andro ...

  8. 20155307 2016-2017-2 《Java程序设计》第8周学习总结

    20155307 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 日志API:使用日志的起点是Logger类,要取得Logger类,必须使用Logger的静态 ...

  9. GPS数据解析

    1.摘要 GPS模块使用串口通信,那么它的的数据处理本质上还是串口通信处理,只是GPS模块的输出的有其特定的格式,需要字符串处理逻辑来解析其含义.如何高效的处理从GPS模块接收到的数据帧,是GPS驱动 ...

  10. TED #01#

    Laura Vanderkam: How to gain control of your free time 1.我们总是不缺乏时间去做重要的事情,即便我们再忙; “我没时间” 的同义词是“我不想做” ...