2017-04-08 46 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'吗? –