我必须创建一个查询,在插入之前检查预订日期是否不重叠

I have to create a query that check before inserting if the booking dates don't overlap

我有一个由这些属性组成的预订 table: 预订(ID、入住、退房)

timestamp(0) 数据类型是这样的:'2022-12-31 23:59:59'。

我需要创建一个 INSERT 查询,在插入之前检查它是否不存在与那些 checkIn/checkOut 日期重叠的另一个查询。

例如,我的数据库中已经有这个元组: (1, '2022-12-03 23:59:59', '2022-12-07 23:59:59')

如果我插入这个元组 (2, '2022-12-04 23:59:59', '2022-12-06 23:59:59') 数据库没有问题,因为 ID 是独特,但我不能在 12/04 - 12/06

的迭代中进行两次预订

这个表达式检查两个区间是否不重叠 (checkIn1 <= checkOut2) 和 (checkOut1 >= checkIn2)

我正在使用 PostgreSQL。

非常感谢

您可以对 CHECKING 和 CHECKOUT 值创建约束,这将只允许插入一个唯一的集合,下一次插入重复数据将失败:

ALTER TABLE BOOKING ADD CONSTRAINT const_BOOKING UNIQUE (CHECKIN, CHECKOUT)

Test in fiddle

关于约束的更多信息here

您可以创建一个临时 table,然后先在 table 中输入数据或行。

CREATE TABLE Table2
(ID bigint PRIMARY KEY,
checkin timestamp(0) NOT NULL, 
checkout timestamp(0) NOT NULL);
    
INSERT INTO Table2
(ID, checkin, checkout)
VALUES
(2, '2022-12-04 23:59:59', '2022-12-06 23:59:59'),
(3, '2022-12-08 23:59:59', '2022-12-09 23:59:59');

现在您可以使用此 table 通过 JOIN 子句将数据插入到原始 table 中:

INSERT INTO Booking (id, checkin, checkout)
SELECT t2.* 
FROM Table2 t2
LEFT JOIN Booking t3
ON t2.id <> t3.id AND (t3.checkin > t2.checkout OR t3.checkout < t2.checkin)
WHERE t3.id IS NOT NULL;

db fiddle link