2015-01-13 3 views
0

У меня есть столбец NVARCHAR, который содержит даты, как это:SQL Server 2008 Измени DateTime ошибки

1 Jul 2010 11:19:22 
18 Jun 2010 9:28:43 
22 Sep 2010 15:22:05 

Это фактически значения, извлеченные из текстового файла. Все, что я хочу сделать, это преобразовать их в тип datetime. Если я попробую:

alter table Table1 
alter column MyDateAsString datetime 

Я получаю: «Преобразование прошло при преобразовании даты и времени из символьной строки».

Я также попытался:

select convert(DateTime, MyDateAsString ,112) from Table1 

, но я получаю ту же ошибку.

Заранее спасибо

+0

создать новый столбец, перенести данные из старого столбца в новый столбец с помощью преобразования, а затем удалить старый столбец – HaveNoDisplayName

+0

Вы уверены, что все значения могут быть преобразованы? Возможно, в текстовом файле произошла ошибка. – DaaaahWhoosh

+0

Все значения (у меня есть только 100) выглядят действительными датами и должны быть в состоянии конвертировать. – user3566591

ответ

0

Похоже у вас есть недопустимые значения даты в таблице. Попробуйте следующее.

Select (case when isdate(MyDateAsString)=1 then convert(DateTime, MyDateAsString ,112) else dateadd(year,100,getdate()) end) as dt from Table1 

всех даты, чей год 2115 имеет недопустимую строку даты в нем (при условии, что ваша системная дата корректна и нет нормальных записей в таблице, чей год 2115).

+0

Этот запрос возвращает ВСЕ мои столбцы как 2115, поэтому поле не распознается как дата. Интересно, есть ли еще способ конвертировать их на сегодняшний день. – user3566591

+0

Проблема была в конце каждого значения: 1 июля 2010 11: 19: 22_. Как только я его устранил, мне удалось изменить таблицу: ALTER TABLE Test ADD MyDateAsString DATETIME ;. Выбор этого ответа будет правильным, исходя из времени и идеи о том, что данные в моей таблице имеют неправильные значения, как вы упомянули. Спасибо за вашу помощь. – user3566591

+0

Отлично. LTrim() и RTrim() пригодится в таких случаях, особенно когда есть много строк. – su8898

1

Вам нужно будет добавить столбец в таблицу с типом данных Datetime, а затем обновить эти значения до этого столбца и отбросить этот столбец и переименовать этот столбец в этот столбец.

/***  Add a column **/ 
ALTER TABLE Table1 
ADD MyDateAsString_New DATETIME; 
GO 

/***  Update **/ 
UPDATE Table1 
SET MyDateAsString_New = CAST(MyDateAsString AS DATETIME) 
WHERE ISDATE(MyDateAsString) = 1 --<-- this will only bring forward 
             -- the valid datetime values 

/***  Drop Column **/ 
ALTER TABLE Table1 
DROP COLUMN MyDateAsString; 
GO 

/***  Rename Column **/ 
sp_RENAME 'Table1.[MyDateAsString_new]' , '[MyDateAsString]', 'COLUMN' 
GO 


Tadaaa 
+0

Это хорошее решение, но когда я делаю обновление, есть 0 записей, из-за которых все мои данные плохие (с пробелом в конце). Цените свой вклад-спасибо – user3566591

Смежные вопросы