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
.