2017-04-08 38 views
0

我有一個表car_rental其中我試圖檢查每個元組的重疊日期,並提出一個EXEPTION錯誤,如果這些值與我的check_date函數重疊。但是無論我做什麼,我都會在函數的第一行收到語法錯誤。我究竟做錯了什麼?PostgresSQL檢查日期和發生錯誤

CREATE FUNCTION check_date(IN i_sdate DATE, IN i_edate DATE, IN i_plate varchar(10), OUT overlap) 
    SET @i_sdate = start_date(i_sdate); 
    SET @i_edate = end_date(i_edate); 
    SET @i_plate = plate(i_plate); 
    BEGIN 
    SET overlap = SELECT CASE WHEN (
     (@i_sdate BETWEEN start_date AND end_date AND @i_plate = plate FROM car_rental)OR 
     (@i_edate BETWEEN start_date AND end_date AND AND @i_plate = plate FROM car_rental)OR 
     (start_date BETWEEN @i_sdate AND @i_edate AND AND @i_plate = plate) 
     THEN 
     RAISE EXCEPTION 'unavailable --> %', plate 
      USING HINT = 'Car is unavailable'; 
    ) 
+1

看來您正在嘗試使用MS SQL Server TSQL for PostgreSQL。嘗試開始[這裏](https://www.postgresql.org/docs/current/static/sql-createfunction.html),繼續[here](https://www.postgresql.org/docs/current/static /xfunc.html)。 PS如果你提到一個錯誤 - 請提供它的文本。 – Abelisto

+1

@Abelisto。 。 。這不完全是SQL Server語法。我想,我看到SQL Server,MySQL和Oracle的元素。 –

+1

@GordonLinoff嗯......是的,知道這段代碼的起源會很有趣。但是,對於我來說,'set @something = ...'是TSQL的標誌(但我記得沒有分號)。 – Abelisto

回答

1

您可以輕鬆地與EXCLUDE constraintrange types做到這一點。您不需要程序功能或觸發器。

CREATE TABLE car_rental (
    licplate text, 
    rentdates daterange, 
    PRIMARY KEY (licplate, rentdates), 
    EXCLUDE USING gist (licplate WITH =, rentdates WITH &&) 
); 

INSERT INTO car_rental VALUES 
    ('123abc', '[2017-01-05, 2017-01-15]'::daterange), 
    ('123abc', '[2017-02-08, 2017-02-10]'::daterange); 

INSERT INTO car_rental VALUES 
    ('123abc', '[2017-01-10, 2017-01-12]'::daterange); 
ERROR: conflicting key value violates exclusion constraint "car_rental_licplate_rentdates_excl" 
DETAIL: Key (licplate, rentdates)=(123abc, [2017-01-10,2017-01-13)) conflicts with existing key (licplate, rentdates)=(123abc, [2017-01-05,2017-01-16)). 
+0

謝謝你的建議,但我需要在一個函數中寫這個,我很不幸地理解了這個問題。 – AJP

+0

它會慢很多,你爲什麼要這麼做?而且,你在使用'daterange'嗎? –