SQL: проверка столбца с помощью GETDATE () - PullRequest
2 голосов
/ 27 апреля 2011

Я установил ограничение, чтобы проверить, имеет ли столбец значение GETDATE() или нет.Правило столбца - принимать даты, которые больше или равны GETDATE().

ALTER TABLE table1
ADD CONSTRAINT chk1 CHECK (date_column >= GETDATE ())

Проблема в том, что, когда я вписываю сегодняшнюю дату в столбец, она выдает ошибку, указывающую, что она конфликтует с ограничением, в противном случае, если я введу завтрашнюю дату, она примет ее.Кажется, что (= знак) не работает.

Мой вопрос: в чем проблема и как ее можно решить?

Ответы [ 4 ]

3 голосов
/ 27 апреля 2011

Если вы просто вводите сегодняшнюю дату в форме мм / дд / гггг, это будет оценка до полуночи текущего дня. Когда вы сравниваете это с GetDate (), оно оценивается как меньшее, чем текущая дата и время Вам необходимо указать GetDate () до начала дня.

Попробуйте использовать

cast(floor(cast(getdate() as float)) as datetime)
2 голосов
/ 27 апреля 2011

Наиболее практичным, я думаю, было бы изменение ограничения на это (по причинам, указанным другими):

ALTER TABLE table1
ADD CONSTRAINT chk1 CHECK (date_column >= CAST(GETDATE() as date))

При желании вы также можете изменить тип столбца с datetime на date

0 голосов
/ 27 апреля 2011

GETDATE возвращает текущее значение ДАТА И ВРЕМЯ (с точностью до миллисекунд), * ​​1003 * НЕ текущее значение ДАТА .

SQL Server использует датуТип данных времени.Только для дат (без информации о времени) по умолчанию используется полночь (т. Е. 00:00).

Если вы введете сегодняшнюю дату БЕЗ ВРЕМЕНИ, по умолчанию будет установлена ​​полночь (т. Е. 00:00).Сегодняшняя дата в полночь всегда будет раньше, чем GETDATE (которая включает текущее время).

Поэтому ваша «сегодняшняя» дата (полночь без указания времени) никогда не будет> = GETDATE.Завтра в полночь, однако, работает, потому что это позже, чем GETDATE.

Эксперимент: укажите сегодняшнюю дату, ПЛЮС ВРЕМЯ (скажем, через час).Это должно быть принято.

0 голосов
/ 27 апреля 2011

Вы должны иметь в виду, что GETDATE () также включает текущее время. Похоже, что ваше ограничение разрешает любое значение, которое GreaterThanOrEqualTo для текущей метки Datetime, для которой оценивается значение. Что я думаю, что в этом случае будет что-нибудь в будущем. Я хотел бы видеть ваш клиентский код, который компенсирует это. Если вы хотите сравнить только с датой, вам нужно изменить ограничение на следующее.

ПРОВЕРКА (CONVERT (DATETIME, CONVERT (varchar (10), date_column, 101)) => CONVERT (DATETIME, CONVERT (varchar (10), GETDATE (), 101)))

Вот краткий пример: ВЫБЕРИТЕ GETDATE () 2011-04-26 20: 39: 11.240

ВЫБРАТЬ КОНВЕРТ (DATETIME, CONVERT (varchar (10), GETDATE (), 101)) 2011-04-26 00: 00: 00.000

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