わかりました、私はこれをすることになりました:
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 &&
)
);
無限大、トランザクションプルーフで完全に機能します。
postgres 9.2でネイティブになる一時的な拡張機能と、9.1で拡張機能として利用できるbtree_gistをインストールする必要がありました。CREATE EXTENSION btree_gist;
nb:nullタイムスタンプがない場合は、私の質問で指定されているように、boxメソッドを使用できる一時的な拡張を使用する必要はありません。