chr*_*ena 11 xml sql-server 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
Run Code Online (Sandbox Code Playgroud)
我的非广泛测试显示最后一位数字是0,3或7.这是一个简单的舍入问题吗?毫秒精度很重要,失去/获得一个或两个不是一个选择.
Qua*_*noi 18
是的,将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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它们DATETIME
的差别在于1
秒,它们的二进制表示形式有所不同0x12C
,即300
十进制.
这是因为SQL Server
存储time
的部分DATETIME
为数字的1/300
从午夜第二蜱.
如果需要更高的精度,则需要将TIME
零件存储为单独的值.比如,将存储时间四舍五入为秒DATETIME
,以及毫秒或INTEGER
其他列中所需的精度.
这将允许您使用复杂的DATETIME
算术,例如添加月份或查找工作日DATETIME
,并且您可以添加或减去毫秒并连接结果.XXXXXX+HH:MM
以获得有效的XML
表示.
由于Quassnoi提到的精度问题如果您可以选择使用SqlServer 2008,您可以考虑使用datetime2数据类型,或者如果您只关心时间部分,则可以使用time数据类型
日期和时间数据类型 - 列出所有类型和他们的准确性
在Sql Server 2005中,如果我需要1毫秒的精度,我会添加一个类型为int的额外列milisecond来存储毫秒数并从dateTime列中删除miliseconds部分(将其设置为000).假设您还需要日期信息.
归档时间: |
|
查看次数: |
4040 次 |
最近记录: |