Как конвертировать varchar с часовым поясом в datetime в sql - PullRequest
2 голосов
/ 19 мая 2009

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

Но SQL Server возвращает следующее сообщение: «Результат: Сообщение 241: Преобразование не удалось при преобразовании даты и / или времени - из строки символов.»

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

set @msg = ' 2009-05-09T13: 50: 59.6361485 + 08: 00 '

select @ msg.value (N '(// root / date / text ()) [1]', 'datetime')

1 Ответ

2 голосов
/ 19 мая 2009

Попробуйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...