SQL Server datetime 数据类型的问题
近日,在查一个收银报表时,发现一个问题,就是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' 了。