我必须创建一个查询,在插入之前检查预订日期是否不重叠
I have to create a query that check before inserting if the booking dates don't overlap
我有一个由这些属性组成的预订 table:
预订(ID、入住、退房)
- ID bigint NOT NULL,
- checkIn 时间戳(0) NOT NULL,
- 签出时间戳(0) 不为空,
- 主键(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)
关于约束的更多信息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;
我有一个由这些属性组成的预订 table: 预订(ID、入住、退房)
- ID bigint NOT NULL,
- checkIn 时间戳(0) NOT NULL,
- 签出时间戳(0) 不为空,
- 主键(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)
关于约束的更多信息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;