2014-10-30 4 views
-3

Я создал таблицу, используя BULK INSERT из файла CSV. Я пробовал с датой, но не смог пройти. Это давало мне ошибку, поэтому пробовал с TradeDate varchar(50), и все работало и сохранялось «11012012» в столбце Tradedate.Как фильтровать столбец даты VARCHAR (50) в SQL Server

Но, когда я пытался получить данные с помощью запроса на выборку:

SELECT * 
FROM FundTranTest 
WHERE CONVERT(DATETIME, RIGHT(TradeDate,4) + Left(TradeDate, 2) + SUBSTRING(TradeDate, 3, 2)) 
     < '2012-12-29' 

Я получил эту ошибку:

Msg 242, Level 16, State 3, Line 1
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Как получить это сделано? Любая помощь будет большой.

затем пытался обновить таблицу, добавив столбец даты:

ALTER TABLE FundTranTest ADD TDate Date 

WITH Udata AS 
(select TradeDate as rcol 
    from FundTranTest 
) 
UPDATE FundTranTest SET TDate = CONVERT(DATETIME,RIGHT(rcol,4)+Left(rcol,2)+SUBSTRING(rcol,3,2)) 
FROM Udata u 
where FundTranTest.TradeDate = u.rcol 

но не работает ....

+5

[Bad hab его удар: выбор неправильного типа данных] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data-type.aspx) - вы всегда должны использовать наиболее подходящий тип данных - вот для чего они нужны, в конце концов! –

+0

Настройки глобализации? например, является ли SQL установленным для американского формата даты, где ваш CSV находится в британском формате? Если вы сохраните свои даты в виде длинной строки даты, то SQL может работать с ней намного проще. например, «11 янв 2012» – WraithNath

+0

Пожалуйста, приложите усилия для форматирования и проверки ваших сообщений в будущем. См. Также http://stackoverflow.com/help/how-to-ask для некоторых советов. –

ответ

0

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

Вам нужно будет выполнить одно из следующих действий:

  • Удалите импортированные данные, корректировать данные в файле CSV, глядя на то, где значения tradedate неверны, их исправление, а затем повторно импортировать данные в ваш стол, но на этот раз в нужный столбец с данными (а не varchar(50), но datetime).
  • Определите, какие данные в вашей текущей таблице неверны, исправьте их в правильном формате, а затем преобразуйте текущий столбец tradedate из varchar(50) в столбец datetime.

Какой бы метод вы решитесь на, прислушайтесь @marc_s слова и ссылки:

Bad habits to kick : choosing the wrong data type you should always use the most appropriate data type - that's what they're there for, after all!

некоторую помощь упаковывают вы выбрали второй способ, вот НЕКОТОРЫХ намеки на то, как вы можете проверить информацию в столбец, они не начинают охватывать то, что все может быть неправильно с вашими данными, но оно должно дать вам и идею о том, что все остальное вы можете проверить для подтверждения:

select tradedate, 
     * 
    from FundTranTest 
where -- Look for TradeDate's that are not even 8 chars long 
     len(tradedate) <> 8 
     -- Shows any years that are not starting with a 2 
    or right(TradeDate, 4) not like '2%' 
     -- Check that your months are correct 
    or left(tradedate, 2) not in ('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12') 
     -- check that dates are correct 
    or substring(tradedate, 3, 2) not in ('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', 
              '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', 
              '21', '22', '23', '24', '25', '16', '17', '18', '19', '30', 
              '31') 
+0

HI BERND, СПАСИБО ДЛЯ UR HELP. U СДЕЛАЛ НЕКОТОРЫЙ СВЕТ И ПОСТАНОВИЛИ. CHEERS –

+0

Нет проблем, но попробуйте использовать заглавные буквы в будущем, пожалуйста :) –

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