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

Restricción de Postgres para un rango de fecha y hora único

Puede mantener su timestamp por separado columnas y seguir usando una restricción de exclusión en una expresión:

CREATE TABLE tbl (
   tbl_id    serial PRIMARY KEY
 , starts_at timestamp
 , ends_at   timestamp
 , EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&) -- no overlapping
);

Construyendo un tsrange valor sin límites explícitos como tsrange(starts_at, ends_at) asume automáticamente los límites predeterminados:incluido el inferior y excluyendo el superior - '[)' , que normalmente es mejor.

Violín SQL.

Relacionado:

  • Evitar entradas adyacentes/superpuestas con EXCLUDE en PostgreSQL

Agregar restricción a la tabla existente

ALTER TABLE tbl ADD CONSTRAINT tbl_no_overlapping_time_ranges
EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&)

Los detalles de sintaxis son los mismos que para CREATE TABLE .