Настоящая проблема заключается в том, что вы вставляете дату и время в столбец даты, а затем проверяете, что столбец даты> = datetime. Так что, если вы вставить строку прямо сейчас, вы проверяете:
2014-02-01 >= 2014-02-01 18:57
Это никогда не будет верно, за исключением тех редких случаях, когда вы можете вставить строку ровно в полночь. То, что вы хотите, я думаю:
EffectiveDate DATE NOT NULL DEFAULT GETDATE(),
CONSTRAINT chk_EffectiveDate CHECK
(EffectiveDate >= CONVERT(DATE, GETDATE())
AND EffectiveDate <= TerminationDate),
TerminationDate DATE NOT NULL DEFAULT '99991231',
CONSTRAINT chk_TerminationDate CHECK
(TerminationDate > CONVERT(DATE, GETDATE())
AND TerminationDate >= EffectiveDate),
Существует еще немного конфликта здесь, хотя, как часть ограничений предполагает дату вступления в силу и дату прекращения может быть оба в тот же день, а другая часть ограничения предотвращает его. И, как сказал в своем комментарии Андрей, это можно было бы упростить до одного ограничения. Предполагая, что вы не имели в виду, чтобы эффективная дата и дата окончания на самом деле попадают в тот же день, это может быть достигнуто с помощью одного, двух столбцов ограничения:
EffectiveDate DATE NOT NULL DEFAULT GETDATE(),
TerminationDate DATE NOT NULL DEFAULT '99991231',
CONSTRAINT chk_Dates CHECK
(EffectiveDate >= CONVERT(DATE, GETDATE())
AND TerminationDate > EffectiveDate)
Хотя, как я упоминаю в моем комментарии выше, я думаю, что токены, такие как 12/31/9999, глупы и не являются подходящей альтернативой NULL. Вы также должны be very careful about using regional, ambiguous formats like mm/dd/yyyy
.
Почему вы хотите положить 31 декабря 9999 года в качестве даты окончания? Если вы еще не знаете дату окончания, это должно быть NULL вместо некоторого значения токена ... –