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:
expr1 ANTARA expr2 [ INCL [USIVE] | EXCL [USIVE]] DAN exp3 [ INCL [USIVE] | EXCL [USIVE]]
Pertimbangkan betapa mudahnya mengekspresikan WHERE DATE_FIELD BETWEEN :dt INCLUSIVE AND :dt+1 EXCLUSIVE
(atau hanya WHERE DATE_FIELD BETWEEN :dt AND :dt+1 EXCL
)
Mungkin ANSI SQL: 2015?