sql >> Base de Datos >  >> RDS >> PostgreSQL

Restricción de superposición de fechas de Postgres

Ok, terminé haciendo esto:

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

Funciona perfectamente con infinity, prueba de transacciones.

Solo tuve que instalar la extensión temporal que será nativa en postgres 9.2 y btree_gist disponible como extensión en 9.1 CREATE EXTENSION btree_gist;

nb:si no tiene una marca de tiempo nula, no es necesario usar la extensión temporal, puede usar el método de cuadro como se especifica en mi pregunta.