2016-03-12 39 views
0

我創造了這個表:如何在postgres中執行此限制?

create table sales(
    code    varchar(3) 
    saledate   date, 
    CONSTRAINT pk_codesale PRIMARY KEY (code) 
); 

日期將在每月的第五天,但如果它是星期一,日期將在第二天,也就是第六天。

+0

你的問題是什麼?我不明白你在做什麼。 –

+0

我嘗試做限制,但沒有。 – postgresqlx12

回答

2

您可以添加一個CHECK約束:

check((extract(day from saledate) = 5 and -- 5. day of month 
     extract(dow from saledate) <> 1) -- but no monday 
     or 
     (extract(day from saledate) = 6 and -- 6. day of month 
     extract(dow from saledate) = 2) -- and tuesday 
    ) 

編輯:

如果你想插入/更新到5或一個月,你應該做的6過程中修改任何日期在你的應用程序中。在SQL中,這有點複雜,觸發器可能是要走的路。我沒有編寫觸發器的專業知識,但修改邏輯是這樣的:

date_trunc('mon',:inDate) + interval '4' day 
+ (case 
    when extract(dow from date_trunc('mon',:inDate) + interval '4' day) = 1 
    then 1 
    else 0 
    end * interval '1' day) 
+0

感謝您的回覆,但是有一些方法是默認完成的? – postgresqlx12

+0

@ postgresqlx12:你的意思是*默認情況下*?當您將此檢查添加到CREATE TABLE時,只要您嘗試插入「錯誤」值,PostgreSQL就會返回錯誤消息。 – dnoeth

+0

檢查約束*可防止輸入錯誤的數據。但它不會將數據更改爲正確的日期。 –