【转】SQL SERVER DateTime类型的精度
先看下边的SQL 语句
CREATE TABLE #DateTest(
Id INT,
SampleDate DATETIME
)
INSERT INTO #DateTest VALUES(1,'1 jan 2010 10:30')
INSERT INTO #DateTest VALUES(2,'2 jan 2010 23:59')
INSERT INTO #DateTest VALUES(3,'3 jan 2010 12:34')
INSERT INTO #DateTest VALUES(4,'3 jan 2010 12:56')
INSERT INTO #DateTest VALUES(5,'4 jan 2010')
INSERT INTO #DateTest VALUES(6,'4 jan 2010 00:00')
INSERT INTO #DateTest VALUES(7,'4 jan 2010 13:31')
INSERT INTO #DateTest VALUES(8,'4 jan 2010 00:10')
INSERT INTO #DateTest VALUES(9,'5 jan 2010 12:01')
DECLARE @DATE1 DATETIME
DECLARE @DATE2 DATETIME
SELECT @DATE1 = '2 jan 2010'
SELECT @DATE2 = '4 jan 2010'
SELECT Id
FROM #DateTest
WHERE SampleDate BETWEEN @DATE1 AND @DATE2
DROP TABLE #DateTest
查询语句查询的是'2010-01-02 00:00:00.000'到'2010-01-04 00:00:00.000'的时间,所以查询结果为2,3,4,5,6。
再执行如下的SQL 语句:
CREATE TABLE #DateTest(
Id INT,
SampleDate DATETIME
)
INSERT INTO #DateTest VALUES(1,'2010-01-01T10:30:21.000')
INSERT INTO #DateTest VALUES(2,'2010-01-01T23:59:59.999')
INSERT INTO #DateTest VALUES(3,'2010-01-02T12:56:00.000')
INSERT INTO #DateTest VALUES(4,'2010-01-02T23:59:59.998')
INSERT INTO #DateTest VALUES(5,'2010-01-03T00:00:00.000')
INSERT INTO #DateTest VALUES(6,'2010-01-03T13:31:00.000')
INSERT INTO #DateTest VALUES(7,'2010-01-04T00:00:00.001')
INSERT INTO #DateTest VALUES(8,'2010-01-04T00:00:00.002')
INSERT INTO #DateTest VALUES(9,'2010-01-05T12:01:00.002')
DECLARE @DATE1 DATETIME
DECLARE @DATE2 DATETIME
SELECT @DATE1 = '2 jan 2010'
SELECT @DATE2 = '4 jan 2010'
SELECT *
FROM #DateTest
WHERE SampleDate BETWEEN @DATE1 AND @DATE2
DROP TABLE #DateTest
查询结果为:
Id SampleDate
----------- -----------------------
2 2010-01-02 00:00:00.000
3 2010-01-02 12:56:00.000
4 2010-01-02 23:59:59.997
5 2010-01-03 00:00:00.000
6 2010-01-03 13:31:00.000
7 2010-01-04 00:00:00.000
在执行结果中,ID为2的日期变成2010-01-02 00:00:00.000.这是为什么呢?
因为,在SQL SERVER中DATETIME表示的时间为00:00:00到23:59:59.997,它的时间精度为1/300秒,在使用时会舍入到舍入到 .000、.003 或 .007 秒三个增量。如下表是DATETIME秒的小数部分精度的舍入。
|
用户指定的值 |
系统存储的值 |
|
01/01/98 23:59:59.999 |
1998-01-02 00:00:00.000 |
|
01/01/98 23:59:59.995 01/01/98 23:59:59.996 01/01/98 23:59:59.997 01/01/98 23:59:59.998 |
1998-01-01 23:59:59.997 |
|
01/01/98 23:59:59.992 01/01/98 23:59:59.993 01/01/98 23:59:59.994 |
1998-01-01 23:59:59.993 |
|
01/01/98 23:59:59.990 |
根据这一规则,在上边的SQL语句中,实际插入表中的数据为:
Id SampleDate
----------- -----------------------
1 2010-01-01 10:30:21.000
2 2010-01-02 00:00:00.000
3 2010-01-02 12:56:00.000
4 2010-01-02 23:59:59.997
5 2010-01-03 00:00:00.000
6 2010-01-03 13:31:00.000
7 2010-01-04 00:00:00.000
8 2010-01-04 00:00:00.003
9 2010-01-05 12:01:00.003
在查询某一天当中的数据时,如果查询条件为BETWEEN '2010-01-02T00:00:00.000'
AND '2010-01-02T23:59:59.999',实际查询的是'2010-01-02T00:00:00.000'
到'2010-01-03T00:00:00.000'之间的数据。
例子如,将上边的SQ语句的查询条件更改为:
SELECT @DATE1 = '2010-01-02T00:00:00.000'
SELECT @DATE2 = '2010-01-02T23:59:59.999'
其执行结果:
Id SampleDate
----------- -----------------------
2 2010-01-02 00:00:00.000
3 2010-01-02 12:56:00.000
4 2010-01-02 23:59:59.997
5 2010-01-03 00:00:00.000
所以,在查询某一天的数据时,查询条件应为:BETWEEN '2010-01-02T00:00:00.000'
AND '2010-01-02T23:59:59.998'。
更改查询条件,重新执行查询:
SELECT @DATE1 = '2010-01-02T00:00:00.000'
SELECT @DATE2 = '2010-01-02T23:59:59.998'
其执行结果为:
Id SampleDate
----------- -----------------------
2 2010-01-02 00:00:00.000
3 2010-01-02 12:56:00.000
4 2010-01-02 23:59:59.997
在SQL SERVER 2008中新增了Datetime2类型,可以提供更高的时间精度,且可以自定义时间精度,以后可以使用这种数据类型。
【转】SQL SERVER DateTime类型的精度的更多相关文章
- sql 根据日期模糊查询&SQL Server dateTime类型 模糊查询
曾经遇到这样的情况,在数据库的Meeting表中有PublishTime (DateTime,8)字段,用来存储一个开会时间,在存入时由于要指明开会具体时间,故格式为yyyy-mm-dd hh:mm: ...
- sql server datetime类型字段使用isnull返回1900-01-01 00:00:00.000的问题
若字段定义的类型为datetime,插入为''(空),那么会默认值为1900-01-01 00:00:00.000 解决方法查询的时候过滤下cast(nullif('','') as datetime ...
- SQL Server时间类型datetime
SQL Server时间类型datetime 兼容ADO的COleDateTime. SQL datetime 日期和时间数据,可表示1753.1.1 至 9999.12.31的时间,精度为1/300 ...
- 【转】一道SQL SERVER DateTime的试题
学习过上一篇SQL SERVER DateTime精度的文章后.再来做一道题. IF ('2011-07-31 00:00:00.000' BETWEEN '2011-07-01' and '2011 ...
- SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理
原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...
- SQL Server锁类型
SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生 ...
- Sqlserver:datetime类型的精度(不确定性)问题
转自http://www.xuebuyuan.com/212359.html 背景:近日进行大型数据表的迁移处理,遭遇创建 主键时 索引键值重复的错误.仔细检查原始表,并未有任何问题.分析后发现是迁移 ...
- MS SQL server对象类型type
执行下面代码,将获取ms sql server对象类型以及其说明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREAT ...
- SQL Server 方言类型映射问题
关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取
随机推荐
- sqlite字符反向模糊查找
sqlite 一个短字符要去db里模糊查找时,可以用like 如select * from t_contact where uphone like '%1234%'; 但是当输入的字符串超过数据库里的 ...
- iOS平台网络类型检测
老大新增个需求,连接服务器时要区分内外网,需求理解了,现实很骨感啊,没办法,干. #import <Foundation/Foundation.h> /* 依赖于以下Framework S ...
- C#各类型大小
- tyvj1017 - 冗余关系 ——并查集
题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1017 并查集 #include <cstdio> #include <cstdlib& ...
- new总结
基础:c++中,什么时候用 A a;和什么时候用A a=new A; new是在堆上分配内存,它需要用delete释放,否则会造成内存泄漏(使用的内存没有即时释放,造成内存的浪费) int main( ...
- Ghost的相关问题
一些和Ghost使用有关的问题,记录在这里. 1,有时候使用ghost恢复,发现最后一步选择驱动器是灰色的,这是因为备份文件有些是用Disk模式,有些使用partition模式,所有恢复的时候如果其中 ...
- 【计算机视觉领域】常用的 feature 提取方法,feature 提取工具包
[计算机视觉领域]常用的 feature 提取方法,feature 提取工具包 利用 VL 工具包进行各种特征的提取: VL 工具包官网地址:http://www.vlfeat.org/index.h ...
- OSGi 的核心配置、动态化及问题
一.OSGi的核心组件Bundle,与java中jar包的差别就是元数据配置: 常用的Bundle元数据定义: a) Bundle-Activator:定义Activator的实现全 ...
- 【Unity3D插件】在Unity中读写文件数据:LitJSON快速教程
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 介绍 JSON是一个简单的,但功能强大的序列 ...
- 怎么用CorelDRAW插入、删除与重命名页面
在绘图之前,页面的各种设置也是一项重要的工作,本文主要讲解如何在CorelDRAW中插入.删除.重命名页面等操作.在CorelDRAW的绘图工作中,常常需要在同一文档中添加多个空白页面,删除一些无用的 ...