К сожалению, SQL Server интерпретирует «пустую» (то есть пустую строку) как дату со значением 1900-01-01. Поэтому, когда вы пишете:
insert into t (datecol)
values ('');
Это в основном скомпилировано в:
insert into t (datecol)
values ('1900-01-01');
Что ты можешь сделать? Наиболее очевидным является не вставлять пустые значения. Вы хотите вставить NULL
, поэтому вставьте NULL
. В этом случае вы можете использовать NULLIF()
:
insert into t (datecol)
values (nullif('', ''));
Это превратит вход в соответствующее значение.
Второй вариант - отклонить такие значения с помощью проверочного ограничения:
alter table t add constraint chk_t_datecol
check (date >= '1950-01-01');
То есть даты находятся в допустимом диапазоне.
Третий вариант - добавить триггер для преобразования '1900-01-01'
в значение NULL
при отображении на входе.
И четвертый вариант - разрешить такие значения, но использовать вычисляемый столбец для справочных целей:
alter table t add datecol_good as ( nullif(datecol, '1900-01-01'));
Все эти опции предполагают, что '1900-01-01'
не является действительной датой, которую вы хотели бы указать в своих данных.