【SqlServer】datetime存储精度问题探究
最近使用sqlserver 2012的时候注意到datetime类型的毫秒的精度是存在问题的,好奇是怎么回事,特意来研究一下
问题复现
如下的sql执行
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.000' Where id=1;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.001' Where id=2;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.002' Where id=3;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.003' Where id=4;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.004' Where id=5;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.005' Where id=6;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.006' Where id=7;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.007' Where id=8;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.008' Where id=9;
UPDATE AlarmItem SET create_time = '2024-01-01 00:00:00.009' Where id=10;
select id,create_time from AlarmItem where id in (1,2,3,4,5,6,7,8,9,10)
不点开下面的执行结果,想想看,觉得答案会是怎么样?
点击查看执行结果
1 2024-01-01 00:00:00.000
2 2024-01-01 00:00:00.000
3 2024-01-01 00:00:00.003
4 2024-01-01 00:00:00.003
5 2024-01-01 00:00:00.003
6 2024-01-01 00:00:00.007
7 2024-01-01 00:00:00.007
8 2024-01-01 00:00:00.007
9 2024-01-01 00:00:00.007
10 2024-01-01 00:00:00.010
可以注意到,数据并没有按照我们期望的那样,例如001 存入后变成了000 而002变成了003,这个原因是什么呢?
探究原因
翻看微软的官方文档可以发现在SQL Server中,DateTime的精度是3.33毫秒,也就是存在精度丢失的情况
同时微软自己定义了关于DateTime时间舍入的规则

总结一下就是:
9进0
0、1舍入为0
2、3、4舍入为3
5、6、7、8舍入为7
【SqlServer】datetime存储精度问题探究的更多相关文章
- C# DateTime类型和sqlserver DateTime精度不同
在最近的项目中, 有个关于时间的功能.一个请假的时间.前端选择的时候只有日期.所以比如请一天假就是选2017-8-15和2017-8-15,这样算请这一天的假.但是后台存入数据库时我不能就存2017- ...
- mssql sqlserver 可以存储二进制数据的字段类型详解
转自: http://www.maomao365.com/?p=6738 摘要: 下文将从数据库的数据类型着手,剖析在sqlserver数据库中可以存储二进制数据的数据类型,如下所示: mssql s ...
- #define与运算精度问题探究
#include <stdio.h> #define SQR(X) X*X int main(int argc, char* argv[]) { ; ; ; printf("SQ ...
- Sqlserver数据库存储路径的修改
Sqlserver数据库存储路径的修改 Sqlserver数据库存储路径问题:本系统sqlserver路径默认是存储在C盘目录下的,由于数据会慢慢变大和避免重装系统数据丢失等问题,最好手动将路径设置在 ...
- sqlserver datetime的bug
sqlserver datetime 的毫秒的个位似乎存在bug,只有0.3.7这三个值,比如: 2018-01-20 23:59:59:999会变成2018-01-21 00:00:00.000 2 ...
- sqlserver datetime的bug?
sqlserver datetime 的毫秒的个位似乎存在bug,只有0.3.7这三个值,比如: 2018-01-20 23:59:59:999会变成2018-01-21 00:00:00.000 2 ...
- 深入理解Sqlserver文件存储之页和应用 (转)
我们每天都在使用数据库,我们部门使用最多的关系数据库有Sqlserver,Oracle,有没有想过这些数据库是怎么存放到操作系统的文件中的?有时候为了能够设计出最优的表结构,写出高性能的Sqlserv ...
- DateTime的精度小问题
一般来说判断时间的话,用个DateTime类型就已经够用了.但是有些情况,比如下面这种 DECLARE @DT1 DATETIME DECLARE @DT2 DATETIME SELECT @DT1 ...
- Sqlserver DateTime转换成SMALLDATETIME时“产生一个超出范围的值”
工作中遇到一个问题,A表中字段(DateTime1)的数据类型为DateTime,新建了一张表B的SMALLDATETIME1字段的数据来自A表的DateTime1 但在将A表字段DateTime1导 ...
- datetime的精度
最近有需要将分钟线的数据进行内联拼接,但时间没有必要精确到秒,微秒. df['datetime'] = pd.to_datetime(df['datetime']) df = df.set_index ...
随机推荐
- Qt开源作品26-通用按钮地图效果
一.前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜 ...
- Qt开源作品17-IP地址输入控件
一.前言 这个IP地址输入框控件,估计写烂了,网上随便一搜索,保证一大堆,估计也是因为这个控件太容易了,非常适合新手练手,一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式 ...
- Ubuntu 装卸Opencv
buntu中卸载opencv的方法: 1.打开ubuntu: 2.找到当初安装opencv的build目录,进入该build目录执行卸载操作: 3.通过rm命令清理/usr中所有opencv相关项即可 ...
- 【Java 温故而知新系列】基础知识-02 数据基本类型
1.Java基本数据类型 Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间. 基本数据类型 数值型:整数类型(byte,short,int,lon ...
- Java 中toString方法在枚举中的应用:展示枚举字段信息
在Java编程中,枚举(enum)是一种特殊的数据类型,它允许程序员定义一组固定的常量.枚举类型在Java中非常有用,尤其是在需要表示一组固定选项(如星期.月份.方向等)时.尽管枚举类型在定义时看起来 ...
- MyBatis中的 10 个宝藏技巧!
前言 说到 MyBatis,很多小伙伴都会用,但未必用得"惊艳". 实际上,这个轻量级的持久层框架还有很多隐藏的"宝藏技巧". 如果你能掌握这些技巧,不但能让开 ...
- G1原理—3.G1是如何提升垃圾回收效率
大纲 1.G1为了提升GC的效率设计了哪些核心机制 2.G1中的记忆集是什么 3.G1中的位图和卡表 4.记忆集和卡表有什么关系 5.RSet记忆集是怎么更新的 6.DCQ机制的底层原理是怎样的 7. ...
- spring-boot-@Valid和@Validated详解
---------------------------------------------------------------------------------------- 在实际的项目开发中,经 ...
- cmake:引入第三方库
需求:开源库中一般都需要引入第三方库,下面以引入boost库为例 (1)安装所需的三方库 boost安装:参考 (2)引入 这里的cmakelists文件为: # Import Boost (for ...
- unicode编码 asis_2019_unicorn_shop
这题就是让我们购买第四个商品 当我们输入price为1337.0的时候他会报错,显示要我们只输入一个字符 那么我们就要想怎样用一个字符来表示一个比1337还要大的数字 答案是unicode 编码 (题 ...