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

如何在SQL中将带有时区的varchar转换为datetime

  •  2
  • sesame  · 技术社区  · 16 年前

    我将C对象序列化为XML,然后得到varchar,如“2009-05-09t13:50:59.6361485+08:00”。

    但SQL Server返回以下消息:“result:msg 241:转换日期和/或时间时失败--从字符串转换。”

    执行以下SQL之后: 声明@msg xml

    设置@msg='<root><日期>2009-05-09t13:50:59.6361485+08:00</date></root>'

    选择@msg.value(n'(//root/date/text())[1],'datetime')

    1 回复  |  直到 16 年前
        1
  •  2
  •   Aaron Fi    16 年前

    试试这个:

    declare @msg xml
    set @msg='<root><date>2009-05-09T13:50:59.6361485+08:00</date></root>'
    select @msg.value(N'(xs:dateTime((//root/date/text())[1]))', 'datetime')
    

    问题是,XML中的日期时间格式在“秒”值中的精度高于value()函数(及其对cast或convert的底层调用)所能处理的精度。见 http://msdn.microsoft.com/en-us/library/ms187928(SQL.90).aspx . 转换类型126和127需要.mmm(3位精度),而在原始值中有7位精度。

    对于调试步骤,请考虑:

    select @msg.value(N'(//root/date/text())[1]', 'varchar(100)')
    > 2009-05-09T13:50:59.6361485+08:00
    
    select @msg.value(N'(xs:dateTime((//root/date/text())[1]))', 'varchar(100)')
    > 2009-05-09T05:50:59.636Z