PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara memvalidasi waktu yang tumpang tindih di Rails dengan postgresql

Anda tidak perlu menemukan kembali roda di PostgreSQL, ada dua metode sederhana yang diterapkan untuk mencapai pemeriksaan tumpang tindih:

  1. 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 ).

  1. Jenis rentang' && (tumpang tindih) operator :

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL pilih elemen di mana jumlah bidang kurang dari N

  2. Bagaimana cara MENGUBAH tabel PostgreSQL dan membuat kolom menjadi unik?

  3. Bagaimana cara mendapatkan bidang kunci untuk tabel dalam fungsi plpgsql?

  4. Mengapa PostgreSQL tidak dapat melakukan GABUNG LENGKAP sederhana ini?

  5. Mengganti urutan dengan nomor acak