先看下边的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类型的精度的更多相关文章

  1. sql 根据日期模糊查询&SQL Server dateTime类型 模糊查询

    曾经遇到这样的情况,在数据库的Meeting表中有PublishTime (DateTime,8)字段,用来存储一个开会时间,在存入时由于要指明开会具体时间,故格式为yyyy-mm-dd hh:mm: ...

  2. sql server datetime类型字段使用isnull返回1900-01-01 00:00:00.000的问题

    若字段定义的类型为datetime,插入为''(空),那么会默认值为1900-01-01 00:00:00.000 解决方法查询的时候过滤下cast(nullif('','') as datetime ...

  3. SQL Server时间类型datetime

    SQL Server时间类型datetime 兼容ADO的COleDateTime. SQL datetime 日期和时间数据,可表示1753.1.1 至 9999.12.31的时间,精度为1/300 ...

  4. 【转】一道SQL SERVER DateTime的试题

    学习过上一篇SQL SERVER DateTime精度的文章后.再来做一道题. IF ('2011-07-31 00:00:00.000' BETWEEN '2011-07-01' and '2011 ...

  5. SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理

    原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...

  6. SQL Server锁类型

    SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生 ...

  7. Sqlserver:datetime类型的精度(不确定性)问题

    转自http://www.xuebuyuan.com/212359.html 背景:近日进行大型数据表的迁移处理,遭遇创建 主键时 索引键值重复的错误.仔细检查原始表,并未有任何问题.分析后发现是迁移 ...

  8. MS SQL server对象类型type

    执行下面代码,将获取ms sql server对象类型以及其说明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREAT ...

  9. SQL Server 方言类型映射问题

    关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取

随机推荐

  1. android 软键盘不遮挡页面上的控件

    只需要加android:windowSoftInputMode="adjustPan"就可以如: <activity android:name=".Enhance_ ...

  2. Javascript模块化编程(三):require.js的用法【转】

    作者: 阮一峰 日期: 2012年11月 7日 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js ...

  3. WindowsServer问题总结

    1.System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志.不可访问的日志: Security.在安装的“回滚”阶段发生异常.将忽略该异常并继续回 ...

  4. HDU-3853 LOOPS(概率DP求期望)

    题目大意:在nxm的方格中,从(1,1)走到(n,m).每次只能在原地不动.向右走一格.向下走一格,概率分别为p1(i,j),p2(i,j),p3(i,j).求行走次数的期望. 题目分析:状态转移方程 ...

  5. 黑马程序员——JAVA基础之构造函数,构造代码块

    ------- android培训.java培训.期待与您交流! ---------- 构造函数特点: 1.  函数名与类名相同 2.  不用定义返回值类型 3.  不可以写return语句 构造函数 ...

  6. java Pattern

    public class Test{ //匹配替换掉order by之后的字符串 public static void main(String[] args) { Pattern pattern = ...

  7. Threadpool dump

    Microsoft (R) Windows Debugger Version 10.0.10586.567 AMD64Copyright (c) Microsoft Corporation. All ...

  8. Linux-IP地址后边加个/8(16,24,32)是什么意思?

    是掩码的位数        A类IP地址的默认子网掩码为255.0.0.0(由于255相当于二进制的8位1,所以也缩写成“/8”,表示网络号占了8位);    B类的为255.255.0.0(/16) ...

  9. Linux信号量详解

    1.什么是信号量信号量是一种特殊的变量,访问具有原子性.只允许对它进行两个操作:1)等待信号量当信号量值为0时,程序等待:当信号量值大于0时,信号量减1,程序继续运行.2)发送信号量将信号量值加1. ...

  10. 011. asp.net内置对象

    Response对象: Response代表了服务器响应对象, 主要用于将数据从服务器发送回浏览器; 每次客户端发出一个请求的时候,服务器就会用一个响应对象来处理这个请求,处理完这个请求之后,服务器就 ...