Được rồi, tôi đã kết thúc việc này:
CREATE TABLE test (
from_ts TIMESTAMPTZ,
to_ts TIMESTAMPTZ,
account_id INTEGER DEFAULT 1,
product_id INTEGER DEFAULT 1,
CHECK ( from_ts < to_ts ),
CONSTRAINT overlapping_times EXCLUDE USING GIST (
account_id WITH =,
product_id WITH =,
period(from_ts, CASE WHEN to_ts IS NULL THEN 'infinity' ELSE to_ts END) WITH &&
)
);
Hoạt động hoàn hảo với vô cực, bằng chứng giao dịch.
Tôi vừa phải cài đặt tiện ích mở rộng tạm thời sẽ có sẵn trong postgres 9.2 và btree_gist có sẵn dưới dạng tiện ích mở rộng trong 9.1 CREATE EXTENSION btree_gist;
nb:nếu bạn không có dấu thời gian rỗng thì không cần sử dụng tiện ích mở rộng tạm thời, bạn có thể sử dụng phương thức hộp như được chỉ định trong câu hỏi của tôi.