2017-06-13 141 views
0

我不想讓我的數據庫用戶輸入比2017-03-18更大的日期。如何將這個約束添加到我的表中? 這是對的嗎?檢查SQL中的約束條件

(Year([ContractEnd])<2017) and (Month([ContractEnd])<03) and (Day([ContractEnd])<18) 
+0

什麼的'型ContractEnd'? 'DATETIME'? – Marusyk

+0

不,這是不對的。您的代碼中的值與您聲明的日期不符。並且沒有必要像這樣檢查一個日期(時間)。 –

+0

列類型是Date。 – kwram

回答

0

嘗試

[ContractEnd] DATE CHECK ([ContractEnd] <= '20170318') 
+0

我嘗試了你所說的,但這裏是錯誤:ALTER TABLE語句與CHECK約束「CK_Professor」衝突。衝突發生在數據庫「大學」,表「dbo.Professor」,列'ContractEnd'。 – kwram

+0

@kwram當然,你應該刪除名爲CK_Professor的先前約束。之後使用'alter table Professor add constraint'。你知道如何去除它嗎? – Marusyk

+0

你說得對,但我還沒有對這個專欄設置任何限制!我沒有這個專欄的限制。 – kwram

3

您可以像添加約束到現有的表像這樣:

alter table t add constraint chk_ContractEnd_lt_20170319 
    check (ContractEnd<'20170319'); 

rextester演示:http://rextester.com/FQWFMI88817

create table t (
    id int not null identity(1,1) 
    , ContractEnd date 
    /* at table creation */ 
    , constraint chk_ContractEnd_lt_20170319 check (ContractEnd<'20170319') 
) 
alter table t drop constraint chk_ContractEnd_lt_20170319; 
/* to existing table */ 
alter table t add constraint chk_ContractEnd_lt_20170319 
    check (ContractEnd<='20170318'); 


insert into t values ('20161231') 
insert into t values ('20170318') 
/* all good */ 

insert into t values ('20170319') 
/* -- Error, constraint violation */ 
+0

如果數據類型是'datetime'或'datetime2',那麼使用'ContractEnd''20170102' '可能是必要的。 –

+0

@BaconBits的確如此。 – SqlZim