2009-10-12 2 views
1

У меня есть данные в формате "2009-07-17T00: 00: 00-05: 00" в переменной varchar. Как я могу преобразовать эти данные в поле datetime в MS SQL-сервере, используя запрос или TSQL?SQL datetime value

+0

что это последний '-05: 00'? какой-то миллисекунды? – dotjoe

+0

dotjoe: Это часовой пояс. –

+1

- все поля 'like '% -05: 00''? Вероятно, придется преобразовать в обычный datetime с помощью строковых функций. – dotjoe

ответ

4

Если вы на SQL Server 2008, вы можете использовать тип datetimeoffset:

select cast('2009-07-17T00:00:00-05:00' as datetimeoffset) 

Так как вы на 2005 datetimeoffset тип данных не доступен для вас. Вы должны решить, хотите ли вы отдельно хранить информацию о часовом поясе. Если вы просто хотите datetime части, просто раздеть часть часового пояса из строки и брось как datetime:

select cast(left('2009-07-17T00:00:00-5:00', 19) as datetime) 
+0

как-то не работает. показывает: «Тип datetimeoffset не является определенным типом системы». Что мне делать? – THEn

+0

Какую версию SQL Server вы используете? 'datetimeoffset' является новым в 2008 году. –

+0

Microsoft SQL Server 2005 - 9.00.1406.00 (X64) 3 марта 2007 г. 19:53:24 Авторское право (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-разрядная версия) в Windows NT 5.2 (Build 3790: Service Pack 2) – THEn

2

В ролях, как DATETIME не будут работать, но этот формат является допустимым форматом XML даты и времени, так вы можете маршрутизировать литье через XML-тип:

declare @d varchar(50); 
select @d = '2009-07-17T00:00:00-05:00'; 

select x.value(N'.', N'datetime') from (select cast(@d as xml) as x) as t; 
+0

да. эти данные взяты из файла XML. Я использовал SELECT [StartDate] FROM OPENXML (@iTree, '/ List/DailyUpdate', 2) WITH ([STARTDATE] varchar (50)) любым способом сделать это в SQL? Я пытался использовать datetime, если он не работает ... – THEn

+1

Можете ли вы использовать XML-методы вместо OPENXML? OPENXML - это динозавр ... Просто скажите 'SELECT xmlfield.value (N '(/ List/Daily/Update) [1]', N'datetime ') FROM table'. С OPENXML вам нужно использовать синтаксис WITH, чтобы указать схему возврата и карту StartDate для datetime: 'SELECT StartDate FROM OPENXML (...) WITH (StartDate DATETIME)'. –

+0

Также в ответе в ответе отображается «Ошибка конверсии при преобразовании даты и времени из символьной строки». Есть идеи ? – THEn