PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Restrição Postgres para intervalo de data e hora exclusivo


Você pode manter seu timestamp separado colunas e ainda usar uma restrição de exclusão em uma expressão:
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
);

Construindo um tsrange valor sem limites explícitos como tsrange(starts_at, ends_at) assume automaticamente os limites padrão:incluindo inferior e excluindo superior - '[)' , que normalmente é melhor.

SQL Fiddle.

Relacionado:
  • Evitando entradas adjacentes/sobrepostas com EXCLUDE no PostgreSQL

Adicionar restrição à tabela existente

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

Os detalhes de sintaxe são os mesmos de CREATE TABLE .