PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Datumsüberschneidungsbeschränkung

Ok, ich habe das gemacht:

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 &&
    )
);

Funktioniert perfekt mit Unendlich, transaktionssicher.

Ich musste nur die temporale Erweiterung installieren, die in postgres 9.2 nativ sein wird, und btree_gist ist als Erweiterung in 9.1 verfügbar CREATE EXTENSION btree_gist;

nb:Wenn Sie keinen Null-Zeitstempel haben, müssen Sie die zeitliche Erweiterung nicht verwenden. Sie können die in meiner Frage angegebene Box-Methode verwenden.