Какие значения не позволяют преобразовать VARCHAR в DATE? - PullRequest
3 голосов
/ 15 марта 2019

Я читаю значение из таблицы ключ / значение, которая должна содержать НЕДЕЙСТВИТЕЛЬНУЮ дату в формате yyyy-MM-dd.

Упрощенная версия запроса:

SELECT CAST(ClaimDate AS DATE) AS ClaimDate
FROM MyTable

Это приводит к сообщению об ошибке:

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

Я тоже пытался CONVERT(DATE, ClaimDate) безрезультатно.

Теперь, более чем зная, почему я получаю эту ошибку, мне любопытно узнать, какие значения вызывают это.

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

Конечно, предложение решения в дополнение к получению плохих значений высоко ценится.

Ответы [ 2 ]

8 голосов
/ 15 марта 2019

В зависимости от версии SQL Server (2012+) вы можете использовать TRY_CONVERT :

SELECT ClaimDate 
FROM   MyTable
WHERE  TRY_CONVERT(DATE, ClaimDate ) IS NULL
    AND ClaimDate IS NOT NULL

Это даст вам значения, которые нельзя преобразовать в дату,как вы собираетесь решать эти проблемы - это другой вопрос.Кроме того, значение 2019-01-12 может быть преобразовано, но если оно находится в строке, вы не можете быть уверены, будет ли это дата в декабре или в январе.Вы можете получить действительные, но неправильные даты!

0 голосов
/ 15 марта 2019

Как объяснили другие, настоящая проблема заключается в использовании varchar вместо date в качестве типа.Это позволило вставлять неверные данные в поле.Исправить это может быть невозможно - что если в разных строках есть строки, использующие разные форматы даты?

CAST(ClaimDate AS DATE) может произойти сбой, если текстовое поле содержит строку без даты.В этом случае строки можно игнорировать с помощью:

SELECT ClaimDate AS ClaimDate
FROM MyTable
where TRY_CAST(ClaimDate as date) is not null

К счастью, типом является date.На разбор datetime влияет настройка DATEFORMAT .Если бы он был установлен в YDM, эта строка все равно работала бы:

set dateformat ydm;

select cast('2019-03-14' as date);

В то время как это бросило бы

set dateformat ydm;

select cast('2019-03-14' as datetime);

Все было бы намного хуже, если бы значение было 2019-03-04.Вместо броска приведение вернуло бы неправильную дату.

К счастью, из замечаний DATEFORMAT:

YDM DATEFORMAT не поддерживается для типов данных date, datetime2 и datetimeoffset.

Именно поэтому сначала следует проверить ошибочные данные с помощью

SELECT ClaimDate AS ClaimDate
FROM MyTable
where TRY_CAST(ClaimDate as date) is not null

Если все в порядке, тип должен быть изменен на date, чтобы гарантировать, что неверные значения не могут бытьвставлено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...