2014-02-01 2 views
2

У меня есть следующие колонкиSQL Server 2012: Проверка Constraint с Значения по умолчанию

EffectiveDate  Date NOT NULL default getDate(),  
    CONSTRAINT chk_EffectiveDate CHECK (EffectiveDate >= getDate() AND EffectiveDate <= TerminationDate) , 

TerminationDate Date NOT NULL default '12/31/9999', 
    CONSTRAINT chk_TerminationDate CHECK (TerminationDate > getDate() AND TerminationDate >= EffectiveDate), 

Проблема я бегу в том, что если я не вводить значения в этих столбце он бросает ошибку checkconstraint, то не принимать значения по умолчанию

Является ли то, что я пытаюсь достичь, возможно?

+0

Почему вы хотите положить 31 декабря 9999 года в качестве даты окончания? Если вы еще не знаете дату окончания, это должно быть NULL вместо некоторого значения токена ... –

ответ

6

Настоящая проблема заключается в том, что вы вставляете дату и время в столбец даты, а затем проверяете, что столбец даты> = 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.

+0

после использования преобразования даты работает должным образом, спасибо за указание (2 из них) EffectiveDate <= TerminationDate сравнение , я на самом деле означал, что это будет выглядеть как EffectiveDate> = CONVERT (DATE, GETDATE()) AND EffectiveDate

+0

Действительно ли необходимо повторить один и тот же тест дважды («Эффективное время» <= TerminationDate' <=> 'TerminationDate> = EffectiveDate')? Я думал, что ограничение проверки работает против строки, а не против столбца, и поэтому этого должно быть достаточно для реализации теста, о котором я говорю только в одном из этих двух ограничений, поскольку он будет выполняться независимо от того, какой столбец даты вы обновлено. –

+0

@AndriyM да, я думаю, вы правы, вам нужно только одно ограничение. Я просто исправлял логику, которая мешала любому ограничению оценивать по назначению. –

Смежные вопросы