Как объяснили другие, настоящая проблема заключается в использовании 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
, чтобы гарантировать, что неверные значения не могут бытьвставлено