xhon Ответов: 2

Как проверить, что дата увеличивается на N дней (int)?


Привет,

Я нахожусь на Sql Server, и у меня есть два значения типа DATE внутри моей таблицы, Date1 и DAte2.

Date1-это текущая дата по умолчанию (я добавил к ней ограничение по умолчанию).
Я хочу, чтобы дата 2 была увеличена на 5 дней (дата 1 + 5 дней) по умолчанию, и чтобы проверить это.

Что я уже пробовал:

I've been trying to do the following but I got errors:


1)
<pre>ALTER TABLE Workshops
ADD CONSTRAINT CK_Workshops_EndDate5daysAfterStartDate
                   CHECK (EndDate = StartDate + 5);

Я не смог завершить эту операцию, потому что date и int-это разные типы значений



2)
ALTER TABLE Workshops
ADD CONSTRAINT DF_EndDate_5daysAfterStartDate
                    DEFAULT DATEADD(day, 5, StartDate )

Я получил эту ошибку:
"Название "StartDate" не допускается в данном контексте. Допустимыми выражениями являются константы, постоянные выражения и (в некоторых контекстах) переменные. Имена столбцов не допускаются."


3)
<pre>ALTER TABLE TableName
ADD CONSTRAINT CK_TableName_Date2Is5DaysAfterSTartDate
        CHECK (Date2= DATEADD(day, 5, StartDate));



Я получил эту ошибку:

The ALTER TABLE statement conflicted with the CHECK constraint "CK_TableName_Date2Is5DaysAfterSTartDate". 

2 Ответов

Рейтинг:
2

OriginalGriff

Посмотрите на функцию DATEADD: Функция SQL Server DATEADD() [^]


xhon

Я тоже попробовал это сделать:


ALTER TABLE TableName
ADD CONSTRAINT CK_TableName_Date2Is5DaysAfterSTartDate
        CHECK (Date2= DATEADD(day, 5, StartDate));



Я получил эту ошибку:

The ALTER TABLE statement conflicted with the CHECK constraint "CK_TableName_Date2Is5DaysAfterSTartDate". 

OriginalGriff

И если вы загуглите сообщение об ошибке, то станет ясно, почему:
https://www.google.com/search-что?q=alter+table+statement+conflicted+with+the+check+constraint&oq=ALTER+TABLE+statement+conflicted+with+the+CHECK+constraint&aqs=chrome.0.0i457j0i22i30.991j0j7&sourceid=chrome&ie=UTF-8

Быстрая проверка покажет вам, что ограничение, которое вы пытаетесь применить, терпит неудачу с данными, уже находящимися в вашей БД. Так что проверьте свою базу данных и сначала разберитесь с этим!

xhon

хорошо, я создал таблицы с нуля, и теперь это работает. Однако у меня все еще есть проблема 2...Я не могу добавить ограничение по умолчанию к Date2, чтобы заставить его быть Date1 + 30 дней

OriginalGriff

Ограничения столбцов не могут ссылаться на другие столбцы, так как SQL не знает, в каком порядке будут предоставляться данные!
Вероятно, вам нужен триггер вместо этого:
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver15

Рейтинг:
1

Richard Deeming

Один CHECK ограничение будет отклонять любые данные, которые не соответствуют ограничению. Если вы попытаетесь вставить / обновить данные с интервалом не более пяти дней, они будут отклонены.

Один DEFAULT ограничение не может получить доступ к данным, будь то из той же строки, другой строки в той же таблице или другой таблицы.

Там нет ничего встроенного, что будет делать то, что вы хотите. Вам нужно будет либо вычислить и вставить значение по умолчанию при создании записи, либо установить столбец в качестве nullable и вычислить значение по умолчанию при чтении записи.