从XML转换为SQL Server datetime时,毫秒错误

时间:2009-03-11 11:20:11

标签: sql-server xml sql-server-2005

我遇到了与将日期时间从XML(ISO8601:yyyy-mm-ddThh:mi:ss.mmm)转换为SQL Server 2005日期时间相关的问题。问题是转换毫秒是错误的。我已经使用nvarchar中的convert(datetime,MyDate,126)测试了隐式和显式转换,结果是相同的:

Original                Result
2009-10-29T15:43:12.990 2009-10-29 15:43:12.990
2009-10-29T15:43:12.991 2009-10-29 15:43:12.990
2009-10-29T15:43:12.992 2009-10-29 15:43:12.993
2009-10-29T15:43:12.993 2009-10-29 15:43:12.993
2009-10-29T15:43:12.994 2009-10-29 15:43:12.993
2009-10-29T15:43:12.995 2009-10-29 15:43:12.997
2009-10-29T15:43:12.996 2009-10-29 15:43:12.997
2009-10-29T15:43:12.997 2009-10-29 15:43:12.997
2009-10-29T15:43:12.998 2009-10-29 15:43:12.997
2009-10-29T15:43:12.999 2009-10-29 15:43:13.000

我的非广泛测试显示最后一位数字是0,3或7.这是一个简单的舍入问题吗?毫秒精度很重要,失去/获得一个或两个不是一个选择。

2 个答案:

答案 0 :(得分:17)

是的,SQL Server将时间缩短到3.(3)毫秒:

SELECT CAST(CAST('2009-01-01 00:00:00.000' AS DATETIME) AS BINARY(8))
SELECT CAST(CAST('2009-01-01 00:00:01.000' AS DATETIME) AS BINARY(8))

0x00009B8400000000
0x00009B840000012C

正如您所看到的,这些DATETIME的差异为1秒,而它们的二进制表示相差0x12C,即十进制的300

这是因为SQL Servertime部分的DATETIME部分存储为午夜的1/300秒钟。

如果您想要更高的精度,则需要将TIME部分存储为单独的值。比如,存储时间四舍五入为DATETIME,以及毫秒或其他列中INTEGER所需的精度。

这将允许您使用复杂的DATETIME算术,例如在DATETIME上添加月份或查找工作日,您只需添加或减去毫秒并将结果连接为{{1}获得有效的.XXXXXX+HH:MM表示。

答案 1 :(得分:6)

由于precision issues mentioned by Quassnoi如果您可以选择使用SqlServer 2008,您可以考虑使用datetime2 datatype,或者如果您只关心时间部分,可以使用time datatype

Date and Time Data Types - 列出所有类型及其准确度

在Sql Server 2005中,如果我需要1毫秒的精度,我会添加一个类型为int的额外列milisecond来存储毫秒数并从dateTime列中删除miliseconds部分(将其设置为000)。假设您还需要日期信息。