Di SQL Server 2000 dan 2005:
- apa perbedaan antara kedua
WHERE
klausa ini? - mana yang harus saya gunakan pada skenario mana?
Pertanyaan 1:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'
Pertanyaan 2:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
AND EventDate <='10/18/2009'
(Sunting: Tanggal Peristiwa kedua awalnya hilang, jadi kueri salah secara sintaks)
Jawaban:
Keduanya identik:
BETWEEN
merupakan singkatan dari sintaks yang lebih panjang dalam pertanyaan.Gunakan sintaks yang lebih panjang alternatif di mana
BETWEEN
tidak berfungsi misalnya(Perhatikan
<
daripada<=
dalam kondisi kedua.)sumber
Mereka sama.
Satu hal yang harus diperhatikan, adalah jika Anda menggunakan ini terhadap DATETIME, pertandingan untuk tanggal akhir akan menjadi permulaan hari:
tidak sama dengan:
(itu akan cocok dengan
<= 20/10/2009 00:00:00.000
)sumber
Meskipun
BETWEEN
mudah dibaca dan dipelihara, saya jarang merekomendasikan penggunaannya karena ini adalah interval tertutup dan seperti yang disebutkan sebelumnya, ini dapat menjadi masalah dengan tanggal - bahkan tanpa komponen waktu.Misalnya, ketika berurusan dengan data bulanan, sering kali umum untuk membandingkan tanggal
BETWEEN first AND last
, tetapi dalam praktiknya biasanya lebih mudah untuk menulisdt >= first AND dt < next-first
(yang juga memecahkan masalah paruh waktu) - karenalast
biasanya menentukan satu langkah lebih lama daripada menentukannext-first
(dengan mengurangi satu hari) .Selain itu, gotcha lain adalah bahwa batas bawah dan atas perlu ditentukan dalam urutan yang benar (yaitu
BETWEEN low AND high
).sumber
Biasanya, tidak ada perbedaan -
BETWEEN
kata kunci tidak didukung di semua platform RDBMS, tetapi jika ya, kedua kueri tersebut harus identik.Karena keduanya identik, sebenarnya tidak ada perbedaan dalam hal kecepatan atau hal lainnya - gunakan yang tampak lebih alami bagi Anda.
sumber
Seperti yang disebutkan oleh @marc_s, @Cloud, et al. mereka pada dasarnya sama untuk jarak tertutup.
Tetapi setiap nilai waktu pecahan dapat menyebabkan masalah dengan kisaran tertutup (besar-atau-sama dan kurang-atau-sama ) sebagai lawan dari berbagai setengah terbuka (lebih-atau-sama dan kurang ) dengan nilai akhir setelah itu saat terakhir mungkin.
Jadi untuk menghindari kueri tersebut harus ditulis ulang sebagai:
Karena
BETWEEN
tidak berfungsi untuk interval setengah terbuka, saya selalu memperhatikan setiap tanggal / waktu kueri yang menggunakannya, karena mungkin ini adalah kesalahan.sumber
Saya memiliki sedikit preferensi
BETWEEN
karena membuatnya langsung jelas bagi pembaca bahwa Anda memeriksa satu bidang untuk suatu rentang . Ini terutama benar jika Anda memiliki nama bidang yang serupa di tabel Anda.Jika, katakanlah, tabel kita memiliki a
transactiondate
dan atransitiondate
, jika saya bacaSaya langsung tahu bahwa kedua ujung ujian berlawanan dengan bidang yang satu ini.
Jika saya membaca
Saya harus mengambil waktu ekstra untuk memastikan kedua bidang tersebut sama.
Selain itu, saat kueri diedit dari waktu ke waktu, programmer yang ceroboh mungkin memisahkan dua bidang. Saya telah melihat banyak pertanyaan yang mengatakan sesuatu seperti
Jika mereka mencoba ini dengan
BETWEEN
, tentu saja, ini akan menjadi kesalahan sintaks dan segera diperbaiki.sumber
Saya pikir satu-satunya perbedaan adalah jumlah gula sintaksis pada setiap kueri. BETWEEN hanyalah cara licin untuk mengatakan persis sama dengan kueri kedua.
Mungkin ada beberapa perbedaan spesifik RDBMS yang tidak saya sadari, tetapi menurut saya tidak demikian.
sumber
Secara logika tidak ada perbedaan sama sekali. Dari segi kinerja, biasanya, pada sebagian besar DBMS- tidak ada perbedaan sama sekali.
sumber
Lihat entri blog yang luar biasa ini dari Aaron Bertrand tentang mengapa Anda harus mengubah format string Anda dan bagaimana nilai batas ditangani dalam kueri rentang tanggal.
sumber
Penafian: Semua yang di bawah ini hanyalah anekdot dan diambil langsung dari pengalaman pribadi saya. Siapa pun yang ingin melakukan analisis yang lebih teliti secara empiris dipersilakan untuk melaksanakannya dan tidak memilih jika saya. Saya juga menyadari bahwa SQL adalah bahasa deklaratif dan Anda tidak harus mempertimbangkan BAGAIMANA kode Anda diproses saat Anda menulisnya, tetapi, karena saya menghargai waktu saya, saya lakukan.
Ada pernyataan ekuivalen logis tak hingga, tapi saya akan mempertimbangkan tiga (ish).
Kasus 1: Dua Perbandingan dalam urutan standar (Urutan evaluasi diperbaiki)
Kasus 2: Gula sintaksis (Urutan evaluasi tidak dipilih oleh penulis)
Kasus 3: Dua Perbandingan dalam urutan terpelajar (Urutan evaluasi dipilih pada waktu penulisan)
Atau
Dalam pengalaman saya, Kasus 1 dan Kasus 2 tidak memiliki perbedaan kinerja yang konsisten atau mencolok karena mereka tidak mengetahui kumpulan data.
Namun, Kasus 3 dapat sangat meningkatkan waktu eksekusi. Secara khusus, jika Anda bekerja dengan kumpulan data yang besar dan kebetulan memiliki pengetahuan heuristik tentang apakah A lebih cenderung lebih besar dari MaxBound atau lebih kecil dari MinBound, Anda dapat meningkatkan waktu eksekusi secara nyata dengan menggunakan Kasus 3 dan mengurutkan perbandingan demikian.
Satu kasus penggunaan yang saya miliki adalah menanyakan kumpulan data historis besar dengan tanggal yang tidak diindeks untuk catatan dalam interval tertentu. Saat menulis kueri, saya akan memiliki gagasan yang baik tentang apakah ada lebih banyak data SEBELUM interval yang ditentukan atau SETELAH interval yang ditentukan dan dapat memesan perbandingan saya sesuai. Saya telah memotong waktu eksekusi hingga setengahnya tergantung pada ukuran kumpulan data, kompleksitas kueri, dan jumlah catatan yang difilter oleh perbandingan pertama.
sumber
A
lebih besar dari kedua batas, maka periksa saja apakahA
lebih besar dariMaxBound
. Pos Anda perlu beberapa penyesuaian.Dalam skenario ini
col BETWEEN ... AND ...
dancol <= ... and col >= ...
setara.Standar SQL juga mendefinisikan predikat T461 Symmetric BETWEEN :
BETWEEN
mengharuskan nilai diurutkan. Misalnya:Di samping itu:
Ini berfungsi persis seperti biasa
BETWEEN
tetapi setelah mengurutkan nilai perbandingan.db <> demo biola
sumber