Interval semi-terbuka (atau Setengah Terbuka, Setengah Tertutup , Setengah Berbatas ) ( [a,b)
, yang x
termasuk dalam interval iff a <= x < b
) cukup umum pada pemrograman, karena mereka memiliki banyak properti yang mudah digunakan.
Adakah yang bisa menawarkan alasan yang menjelaskan mengapa SQL BETWEEN
menggunakan interval tertutup ( [a,b]
)? Ini adalah esp. tidak nyaman untuk kencan. Mengapa Anda harus BETWEEN
bersikap seperti ini?
Jawaban:
Saya pikir inklusif
BETWEEN
lebih intuitif (dan tampaknya, begitu pula para desainer SQL) daripada interval semi-terbuka. Misalnya, jika saya mengatakan "Pilih angka antara 1 dan 10", kebanyakan orang akan memasukkan angka 1 dan 10. Interval terbuka sebenarnya sangat membingungkan bagi non-pengembang karena asimetris. SQL kadang-kadang digunakan oleh non-programmer untuk membuat pertanyaan sederhana, dan semantik semi-terbuka akan jauh lebih membingungkan bagi mereka.sumber
PERTANYAAN: Mengapa SQL ANTARA inklusif?
JAWABAN: Karena desainer bahasa SQL membuat keputusan desain yang buruk, karena mereka gagal memberikan sintaksis yang akan memungkinkan pengembang untuk menentukan mana dari 4 varian BETWEEN (tertutup, semi-terbuka-kiri, semi-terbuka-kanan, atau terbuka). ) mereka lebih suka.
REKOMENDASI: Kecuali / sampai standar SQL diubah, jangan gunakan ANTARA tanggal / waktu. Alih-alih terbiasa dengan pengkodean perbandingan rentang DATE sebagai kondisi independen pada batas awal dan akhir dari ANTARA rentang Anda. Ini agak bertele-tele, tetapi akan membuat Anda menulis kondisi yang intuitif (sehingga kurang cenderung buggy) dan jelas untuk pengoptimal database, memungkinkan rencana eksekusi yang optimal untuk ditentukan dan indeks yang akan digunakan.
Misalnya, jika kueri Anda menerima spesifikasi hari input dan harus mengembalikan semua catatan yang jatuh pada tanggal tersebut, Anda akan mengkodekan sebagai:
WHERE DATE_FIELD >= :dt AND DATE_FIELD < :dt+1
Mencoba untuk menulis logika menggunakan ANTARA risiko kinerja dan / atau kode kereta. Tiga kesalahan langkah umum:
1)
WHERE DATE_FIELD BETWEEN :dt AND :dt+1
Ini hampir pasti merupakan bug - pengguna mengharapkan untuk melihat hanya catatan untuk tanggal tertentu, namun suatu hari akan berakhir dengan laporan yang berisi catatan dari pukul 12:00 pagi hari berikutnya.
2)
WHERE TRUNC(DATE_FIELD) = :dt
Memberikan jawaban yang benar, tetapi menerapkan fungsi ke DATE_FIELD akan membuat sebagian besar pengindeksan / statistik tidak berguna (meskipun kadang-kadang DBA akan mencoba membantu dengan menambahkan indeks berbasis fungsi ke bidang tanggal - masih membakar jam kerja dan ruang disk dan menambahkan overhead ke IUD operasi di atas meja)
3)
WHERE EVENT_DATE BETWEEN :dt AND :dt + 1-1/24/60/60
Tom Kyte, guru Oracle yang luar biasa, merekomendasikan solusi IMO yang kurang elegan ini. Bekerja sangat baik sampai Anda menghabiskan sepanjang hari untuk menemukan bahwa "1-1 / 24/06/60" dalam kueri yang memberikan hasil tidak lengkap ... atau sampai Anda menggunakannya secara tidak sengaja di bidang TIMESTAMP. Plus, ini agak eksklusif; kompatibel dengan tipe data DATE Oracle (yang melacak ke yang kedua), tetapi perlu disesuaikan dengan ketepatan DATE / TIME dari berbagai produk database.
SOLUSI: Petisi komite SQL ANSI untuk meningkatkan spesifikasi bahasa SQL dengan memodifikasi sintaks ANTARA untuk mendukung spesifikasi alternatif ke standar TUTUP / INKLUSIF. Sesuatu seperti ini akan membantu:
Pertimbangkan betapa mudahnya mengekspresikan
WHERE DATE_FIELD BETWEEN :dt INCLUSIVE AND :dt+1 EXCLUSIVE
(atau hanyaWHERE DATE_FIELD BETWEEN :dt AND :dt+1 EXCL
)Mungkin ANSI SQL: 2015?
sumber
exp1 BETWEEN exp2 AND exp3 AND exp1 != exp3
cara itu Anda bisa menjaga antara operator sehingga Anda tahu itu adalah predikat berkisar, dan predikat ketidaksetaraan memastikan bahwa itu semi terbuka.Baik inklusif (
a <= x <= b
) dan eksklusif (a < x < b
) hampir sama-sama umum, jadi ketika membuat standar mereka hanya harus memilih satu. "Antara" dalam bahasa Inggris umum biasanya inklusif, dan pernyataan SQL dimaksudkan untuk membaca mirip dengan kalimat bahasa Inggris, jadi inklusif adalah pilihan yang masuk akal.sumber
a <= x < b
setengah terbuka.Operator tidak dipanggil
∩[a,b)
, itu disebutBETWEEN
, jadi itu jauh lebih tepat untuk semantik untuk menjadi orang-orang dari ungkapan bahasa Inggris "berada di antara" daripada yang dari predikat matematika "adalah dalam interval semi-terbuka".sumber
BETWEEN
operator tidak menggunakan semantik dari frasa bahasa Inggris "is between". Dalam bahasa Inggris "between" adalah waktu, ruang atau interval yang memisahkan berbagai hal (yaitu eksklusif ). Jika Anda mencoba menendang gol, bola harus masuk di antara tiang untuk mencetak gol. Jika Anda membentur tiang gagal melewati di antara mereka - tidak ada skor untuk Anda.