代码之家  ›  专栏  ›  技术社区  ›  chriscena

从XML转换为SQL Server日期时间时出现毫秒错误

  •  11
  • chriscena  · 技术社区  · 17 年前

    我遇到了一个与将日期时间从XML(ISO8601:yyyy-mm-ddThh:mi:ss.mmm)转换为SQLServer2005日期时间相关的问题。问题是转换毫秒时出错。我使用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 回复  |  直到 17 年前
        1
  •  20
  •   Quassnoi    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 十进位。

    这是因为 time 部分 日期时间 作为一些 1/300 第二次从午夜开始滴答作响。

    如果您想要更高的精度,则需要存储 TIME 日期时间 ,毫秒或任何你需要的精度 INTEGER

    算术,比如增加月数或计算周数 ,您只需添加或减去毫秒,并将结果连接为 .XXXXXX+HH:MM 生效 XML 代表性。

        2
  •  7
  •   Community Mohan Dere    9 年前

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

    Date and Time Data Types

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