SQL Server различает кажущиеся одинаковыми строки даты и выбрасывает ошибку преобразования - PullRequest
0 голосов
/ 18 февраля 2019

После импорта строк даты в формате dd.(m)m.yyyy из .csv мне кажется, что я не могу преобразовать их в даты.

Использование CONVERT (date, DATE_COLUMN, 104) вызывает ошибку:

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

Однако, если я пытаюсь преобразовать значения, скопированные из вывода выбора столбца (CONVERT (date, '20.5.2018', 104)), код работает нормальнодля каждого отдельного значения в столбце.

Обрезка строк не работает.Я также попытался вручную переписать строку даты в исходном файле, но результат тот же.

Подводя итог (используя 1 пример значения):

select CONVERT(date, DATE_COLUMN, 104)  
from dbo.table

возвращает:

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

select DATE_COLUMN 
from dbo.table

возвращает: 20.5.2018

select CONVERT(date,'20.5.2018', 104) 

возвращает: '2018-5-20 '

Я ожидаю, что SQL Server будет обрабатывать каждое преобразование одинаково.Несмотря на то, что существует обходной путь (разбиение строки на части даты и объединение их в дату), я не понимаю, почему преобразование не удается в первую очередь.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Ваша проблема не воспроизводима.Следующий тест:

CREATE TABLE dt (DATE_COLUMN varchar(10));

INSERT INTO dt VALUES ('20.5.2018');

SELECT CONVERT(date, DATE_COLUMN, 104)  
FROM dt;

DROP TABLE dt;

возвращает 2018-05-20 и не приводит к ошибке.

0 голосов
/ 19 февраля 2019

Проблема была вызвана тем, что возврат каретки импортировался в каждую строку вместе со строкой.Ограничитель строки соединения с плоским файлом был установлен на {LF}, однако некоторые исходные плоские файлы использовали разделитель {CR} {LF}, поэтому символ {CR} импортировался в столбец.

Поскольку я пытался обрезать значения, и это не сработало, я пришел к выводу, что обо всех «невидимых» персонажах позаботились.Честно говоря, мне даже не приходило в голову, что можно импортировать возврат каретки в столбец.

Поскольку я не мог изменить исходные файлы, и я не уверен, как установить динамический разделительдля импорта я решил проблему, удалив {CR} с помощью:

REPLACE(DATE_COLUMN,char(13),'')
0 голосов
/ 18 февраля 2019

Используйте try_convert(), чтобы найти значения проблемы:

select DATE_COLUMN 
from dbo.table
where try_convert(date, DATE_COLUMN, 104) is null and
      DATE_COLUMN is not null;
...