码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server datetime 数据类型的问题

时间:2015-08-03 18:16:41      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

近日,在查一个收银报表时,发现一个问题,就是SQL Server中时间日期的字符串值转datetime 类型时,出现了奇怪的事情。

查询如下:

需查询2015-07-01这天的收银数据。传入的日期为:开始日期 ‘2015-07-01 00:00:00.000‘ , 结束日期 ‘2015-07-01 23:59:59.999‘ 。

查询后,发现此收银报表的赠送金额和其它报表的赠送金额对不上。经跟踪发现,赠送金额是有一个表A存储的,A表的日期字段为char类型,仅保存了日期部分的值。

当我们传人的结束日期 ‘2015-07-01 23:59:59.999‘ 值再转换为datetime类型时,值变为了‘2015-07-02 00:00:00.000‘,这样查询A表时会将 2015-07-02 这
天的赠送金额也查询出来,这样赠送金额就多了数据,自然和某些报表对不上了。

那么,现在就有一个问题了:按常理来说1秒等于1000毫秒,那为什么‘2015-07-01 23:59:59.999‘值转换为datetime类型时,值会变为‘2015-07-02 00:00:00.000‘呢?

查询SQL Server的帮助文档,文档中有如下的说明:

datetime :日期和时间数据,从 1753 年 1 月 1 日到 9999 年 12 月 31 日,准确度为三百分之一秒或 3.33 毫秒。值被圆整到 .000、.003 或 .007 毫秒增量。

后来在ItzikBen-Gan的著作《Microsoft SQL Server 2005技术内幕:T-SQL查询》看到,书中对datetime 类型也有说明:datetime类型的毫秒部分模式为[0-9][0-9][037]。
也就是说毫秒部分最后一位,只有三种可能的值:0、3、7,且有一个1/3的约数。当值为9时,会舍入到下一秒。


这就是为什么 ‘2015-07-01 23:59:59.999‘ 值转换为datetime类型时,值会变成为 ‘2015-07-02 00:00:00.000‘ 了。

SQL Server datetime 数据类型的问题

标签:

原文地址:http://www.cnblogs.com/zhouzx/p/4699699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!