Как преобразовать дату и время VARCHAR в тип DATETIME для заполнения таблицы

У меня есть таблица со столбцом VARCHAR() со значениями в этом формате:

2012-10-05T11:14:00-04:00

Мне нужно поместить эти данные в другую таблицу, где тип данных поля — DATETIME.

Как я могу преобразовать

2012-10-05T11:14:00-04:00

to

2012-10-05 11:14:00

?

Я старался:

CAST(LEFT(REPLACE(fieldtimestamp, 'T', ' '), 19) AS DATETIME)

Но он продолжает выдавать мне ошибку:

Ошибка преобразования при преобразовании даты и/или времени из строки символов.


person RJ.    schedule 30.01.2013    source источник


Ответы (4)


select CAST(LEFT(REPLACE('2012-10-05T11:14:00-04:00', 'T', ' '), 19) AS DATETIME)

работает для меня

2012-10-05 11:14:00.000

под sql сервер 2012

person automatic    schedule 30.01.2013
comment
в двойных кавычках не было пробела. это мой плохой! Спасибо! :) - person RJ.; 30.01.2013
comment
@Rj. они сделали по вашему запросу - person Lamak; 30.01.2013
comment
Будьте очень осторожны с удалением T. Это может фактически сломать ваше значение даты/времени в зависимости от настроек dateformat/language. См. sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/ - person Aaron Bertrand; 31.01.2013

Это будет делать: SELECT CONVERT(DATETIME,LEFT(fieldtimestamp,19),126)

Нет необходимости заменять 'T'.

person Lamak    schedule 30.01.2013
comment
+1 удалять T даже очень плохая идея, потому что это делает конверсию зависимой от set dateformat. - person Mikael Eriksson; 30.01.2013
comment
@MikaelEriksson Да, я тоже так думаю. И op не использует безопасное преобразование, не указывая формат явно. Но, ну это мое мнение - person Lamak; 30.01.2013
comment
Подробнее здесь о том, что может произойти при использовании формата даты гггг-мм-дд без указания формат в конверте. Использование T безопасно даже без формата, поэтому ваш ответ вдвойне безопасен :). - person Mikael Eriksson; 30.01.2013
comment
И SET LANGUAGE — попробуйте SET LANGUAGE FRENCH и в любой день › 12. Подробнее здесь: sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/ - person Aaron Bertrand; 31.01.2013

Если вы используете MS SQL Server 2008, вы можете использовать DATETIMEOFFSET вместо DATETIME, и это будет работать.

BEGIN
DECLARE @d DATETIMEOFFSET
SELECT @d = '2012-10-05 11:14:00-04:00'
END
person Louis Ricci    schedule 30.01.2013

SELECT thedate, CAST( LEFT(REPLACE(thedate, 'T', ' ' ) , 21 ) AS DATETIME ) FROM MyTbl1

Если вы хотите секунды, вам нужно будет взять 21 букву,

thedate                     DATETIME
2012-10-05T11:14:00-04:00   2012-10-05 11:14:00
2012-10-05T11:14:00-05:00   2012-10-05 11:14:00

Работал нормально в mysql

person MrSimpleMind    schedule 30.01.2013
comment
Почему все хотят заменить Т? Это не просто так! - person Aaron Bertrand; 31.01.2013