Как конвертировать varchar с часовым поясом в datetime в sql

2

Я сериализую свой объект С# в xml, затем получил varchar, такой как '2009-05-09T13: 50: 59.6361485 + 08: 00'.

Но SQL Server возвращает следующий messgae: "Результат: Msg 241: Ошибка конверсии при преобразовании даты и/или времени - из символьной строки."

после выполнения следующего sql: объявить @msg xml

set @msg = '<root> <date> 2009-05-09T13: 50: 59.6361485 + 08: 00 </date </root> '

выберите @msg.value(N '(//root/date/text()) [1]', 'datetime')

Теги:

1 ответ

2
Лучший ответ

Попробуйте следующее:

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')

Проблема заключается в том, что формат 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
  • 0
    Спасибо ! Мой код: <BR> объявить @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')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню