Kembali Pertanyaan #1 :tertutup-terbuka adalah cara standar untuk menangani rentang tanggal, dengan 20-25 tahun sejarah dalam literatur akademis. Lihat hal. 24-25 dari Data Bittemporal oleh Tom Johnston, dan juga Mengembangkan Aplikasi Database Berorientasi Waktu di SQL oleh Richard Snodgrass.
Tapi saya pikir salah satu alasannya adalah rentang berurutan tidak tumpang tindih. Jika a
adalah [May2016, Jun2016)
dan b
adalah [Jun2016, Jul2016)
, mereka tidak berbagi hari apa pun. Jadi mereka "bersama", dan Anda tidak perlu khawatir tentang kasus tepi di mana mereka bersentuhan.
Perhatikan bahwa satu kelemahan (mungkin) dari tertutup-terbuka adalah Anda tidak dapat menentukan rentang kosong. [May2016, May2016)
hanyalah kontradiksi diri, sedangkan [May2016, May2016]
adalah sekejap.
Kembali Pertanyaan #2 :Sekali lagi itu bisa saja berbeda, tetapi saya dapat memikirkan beberapa keuntungan dari membuat upper([May2016, Jun2016))
kembalikan Jun2016
:
- Ini mengembalikan hal yang sama terlepas dari resolusi rentang.
- Ini lebih seperti arti matematis dari titik akhir terbuka, di mana itu adalah satu-satunya kemungkinan jawaban.
- Ini mengembalikan apa yang cocok dengan "label", jadi bisa dibilang kurang mengejutkan.
- Ini memungkinkan Anda dengan mudah melihat apakah dua rentang "bertemu":
upper(a) = lower(b)
.
Juga, perhatikan bahwa di Postgres semua tipe data terkait waktu bersifat diskrit. Dulu ada opsi untuk mengkompilasi Postgres dengan stempel waktu berbasis float, tetapi sudah tidak digunakan lagi dan saya belum pernah menemukannya.