Anda tidak perlu menemukan kembali roda di PostgreSQL, ada dua metode sederhana yang diterapkan untuk mencapai pemeriksaan tumpang tindih:
- SQL
OVERLAPS
operator :
Cukup sederhana,
where("(start_at, end_at) OVERLAPS (?, ?)", range.first, range.last)
Namun ini memungkinkan satu rentang tepat setelah yang lain
(dengan kata lain, ia memeriksa mulai <=waktu
Ini juga sederhana, biasanya. Tetapi PostgreSQL tidak memiliki tipe rentang bawaan untuk time
(namun ada tsrange
, tstzrange
, dan daterange
untuk tipe temporal lainnya).
Anda perlu membuat sendiri jenis rentang ini:
CREATE TYPE timerange AS RANGE (subtype = time);
Tetapi setelah ini, Anda dapat memeriksa tumpang tindih dengan
where("timerange(start_at, end_at) && timerange(?, ?)", range.first, range.last)
Kelebihan jenis jangkauan:
-
Anda dapat mengontrol diri sendiri, bagaimana Anda ingin menangani batas jangkauan
f.ex. anda dapat menggunakan
timerange(start_at, end_at, '[]')
untuk menyertakan titik awal &titik akhir rentang. Secara default, ini mencakup awal, tetapi tidak termasuk titik akhir rentang. -
itu dapat diindeks, f.ex. dengan
CREATE INDEX events_times_idx ON events USING GIST (timerange(start_at, end_at));
-
Keterbatasan pengecualian :ini pada dasarnya sama, apa yang ingin Anda capai, tetapi akan diberlakukan di tingkat DB (seperti,
UNIQUE
atau kendala lainnya):ALTER TABLE events ADD CONSTRAINT events_exclude_overlapping EXCLUDE USING GIST (timerange(start_at, end_at) WITH &&);