PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Contrainte de chevauchement de date Postgres

Ok j'ai fini par faire ça :

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

Fonctionne parfaitement avec l'infini, preuve de transaction.

Je devais juste installer l'extension temporelle qui va être native dans postgres 9.2 et btree_gist disponible en tant qu'extension dans 9.1 CREATE EXTENSION btree_gist;

nb :si vous n'avez pas d'horodatage nul, il n'est pas nécessaire d'utiliser l'extension temporelle, vous pouvez utiliser la méthode box comme spécifié dans ma question.