SQL BETWEEN adalah operator yang digunakan untuk menentukan rentang nilai yang akan diuji. Nilai yang dikembalikan bisa inklusif atau dalam rentang. Atau bisa juga di luar jangkauan jika Anda menambahkan operator NOT sebelumnya. Ini berfungsi untuk tanggal, tanggal dengan waktu, angka, dan string.
Anda dapat menggunakannya pada klausa WHERE untuk hal berikut:
- PILIH,
- MASUKKAN (dengan PILIH)
- PERBARUI,
- dan HAPUS.
Ini juga berfungsi untuk klausa HAVING bersama dengan GROUP BY.
Tetapi jika Anda tidak hati-hati, SQL BETWEEN dapat membuat Anda gila saat menggunakannya, terutama dengan tanggal dengan waktu.
Tidak perlu khawatir. Kami memiliki contoh untuk menangani gotcha dalam menggunakan SQL ANTARA. Namun sebelumnya, sampel data yang saya gunakan berasal dari NOAA . Anda dapat meminta data cuaca secara gratis dari mereka. Saya menggunakan catatan suhu per jam untuk Amerika Serikat pada tahun 2010. Kemudian, saya mengimpor data CSV ke SQL Server menggunakan SQL Server Management Studio. Saya mengganti nama kolom dan menambahkan indeks yang tidak berkerumun.
Mari kita mulai.
Menggunakan SQL ANTARA dengan Tanggal dan Waktu
Ini harus menjadi item yang paling banyak dicari ketika berhadapan dengan SQL BETWEEN. Kami akan menggunakan contoh untuk menjelaskan cara kerjanya.
Kiat #1:Untuk Kolom DATETIME, Tentukan Tanggal dan Waktunya
PENGGUNAAN SALAH
Mari kita mulai dengan penggunaan yang salah untuk menekankan hal ini. Penggunaan kolom BETWEEN dengan DATETIME berikut akan memberikan hasil yang tidak terduga.
SELECT
DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010' AND '01/02/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;
Kueri mengembalikan data selama 2 hari dari stasiun cuaca di dekat Bandara Internasional O'Hare di Chicago. Anda dapat melihat rentang antara nilai yang lebih rendah (01/01/2010) dan nilai yang lebih tinggi (01/02/2010). Inilah hasil yang ditetapkan pada Gambar 1.
Gambar 1 . Hasil kumpulan kueri menggunakan SQL ANTARA 2 tanggal.
Tapi di mana masalahnya?
Ini seharusnya menjadi rekor per jam selama 2 hari. Karena itu, set hasil harus memiliki 48 catatan. Tapi perhatikan ini hanya 24. Masalahnya terletak pada elemen waktu DateHour kolom. Saat Anda tidak menentukan waktu di kolom DATETIME, ini mengasumsikan 00:00 atau 12:00 AM. Perhatikan juga bahwa data dimulai pada 1 Januari 2010, pukul 01:00, bukan 12:00.
Jadi, secara internal, SQL Server menggunakan DateHour ANTARA ’01/01/2010 00:00:00.000′ DAN ’01/02/2010 00:00:00.000′ . Bagaimana kami tahu?
TANGGAL SEBENARNYA ADALAH STRING
Itu benar.
Nilai tanggal yang diapit dalam tanda kutip tunggal sebenarnya bukan tanggal tetapi string . SQL Server menggunakan konversi implisit untuk mengonversi string ke DATETIME. Setelah konversi, porsi waktu akan ditambahkan ke tanggal.
Mari kita periksa dengan Sertakan Rencana Eksekusi Aktual . Tekan Ctrl-M di SQL Server Management Studio, lalu jalankan kembali contoh sebelumnya.
Saat Execution Plan muncul, klik kanan Index Seek operator dan pilih Properti . Lihat Gambar 2.
Gambar 2 . Konversi implisit string ke DATETIME. Itu disembunyikan di Rencana Eksekusi kueri menggunakan BETWEEN.
Kemudian perluas Cari Predikat . Bagian kotak dari Gambar 2 menunjukkan konversi implisit dari 2 string ke DATETIME. Karena konversi implisit dilakukan secara internal , pemula menjadi bingung mengapa harapan mereka dalam kumpulan hasil tidak terpenuhi.
PENGGUNAAN YANG BENAR
Contoh di bawah ini akan mengembalikan catatan per jam antara pukul 08:00 dan 12:00 pada tanggal 2 Januari 2010.
SELECT * FROM TemperatureData
WHERE DateHour BETWEEN '01/02/2010 08:00' AND '01/02/2010 12:00'
AND Latitude = 41.995
AND Longitude = -87.9336;
Anda perlu menentukan porsi waktu, terutama jika tanggalnya sama. Atau hasil yang Anda harapkan tidak akan terjadi.
Untuk mengembalikan catatan sepanjang hari, ini tidak akan berhasil:
SELECT
DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour = '06/01/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;
Itu hanya akan mengembalikan 1 catatan – yang untuk 1 Juni 2010, pukul 12:00. Tetapi menggunakan ANTARA dengan waktu yang ditentukan, Anda dapat mengembalikan catatan setiap jam sepanjang hari. Lihat contoh berikutnya.
SELECT
DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010 00:00' AND '06/01/2010 23:00'
AND Latitude = 41.995
AND Longitude = -87.9336;
Perhatikan bahwa saya menentukan hingga 23:00 saja. Jika data Anda menggunakan waktu kapan saja, gunakan pukul 23:59 atau 23:59 dalam nilai rentang yang lebih tinggi. Tentukan juga detiknya jika Anda membutuhkannya.
Kiat #2:Pertimbangkan Jenis Data TANGGAL
Jika Anda tidak membutuhkan porsi waktu, pertimbangkan tipe data DATE sebagai gantinya. Dan Anda akan terhindar dari masalah yang disebutkan di atas.
SQL ANTARA dengan Angka
Mari beralih ke angka.
Kiat #3:Sertakan Bagian Desimal untuk Nilai Non-Bilangan Bulat
SELECT
DateHour
,[Hourly_Heating_Degree_Hours]
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010' AND '06/5/2010 23:00'
AND [Hourly_Heating_Degree_Hours] BETWEEN 5.0 AND 7.0
AND Latitude = 41.995
AND Longitude = -87.9336;
Perhatikan penambahan kondisi lain yang melibatkan angka. Hasilnya selanjutnya akan dibatasi pada 5 dan 7 derajat.
Saat menggunakan tipe data DECIMAL, MONEY, atau FLOAT, tentukan bagian desimal meskipun nol, seperti 52,00 atau 10.0000. Dengan cara ini, Anda menghindari konversi implisit ke tipe data DECIMAL, MONEY, atau FLOAT target.
SQL ANTARA dengan String
Tips #4:Untuk String, Rentang Berdasarkan Collation
Dengan string, BETWEEN mengevaluasi nilai berdasarkan urutan abjad. 'A' adalah yang terkecil dan 'Z' adalah yang terbesar. Anda juga dapat mengatakan bahwa secara umum, evaluasi didasarkan pada pemeriksaan. Karena bahasa Inggris bukan satu-satunya bahasa yang didukung SQL Server. Koleksi menyediakan aturan penyortiran, huruf besar/kecil, dan sensitivitas aksen. Mari gunakan AdventureWorks database untuk contoh ini. Lihat kode di bawah ini dan hasilnya pada Gambar 3.
USE AdventureWorks
GO
SELECT
LastName
,FirstName
,MiddleName
FROM Person.Person
WHERE Lastname BETWEEN 'Spanaway' AND 'Splane'
ORDER BY LastName;
Gambar 3 . Hasil kumpulan kueri menggunakan ANTARA dengan string.
Rentang mencakup nama belakang Spanyol . Tapi di mana Pesawat ? Itu tidak ada di database. Jadi, hasilnya hanya mencapai Spicer .
Kiat ANTARA SQL untuk Semua Jenis Data yang Didukung
Baik Anda menggunakan BETWEEN untuk tanggal, angka, atau string, ada beberapa hal umum yang harus Anda ketahui. Ini bisa jadi masuk akal, tetapi masih terjadi karena kesalahan. Baca bagaimana ini bisa terjadi.
Kiat #5:Nilai Awal dan Akhir Tidak boleh NULL
BETWEEN membutuhkan nilai awal dan akhir untuk rentang. Masing-masing harus memiliki nilai yang bukan NULL. Ada contoh dengan nilai akhir NULL di bawah ini.
SELECT
DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010' AND NULL;
Ini dapat terjadi jika Anda memanggil pernyataan SELECT dari aplikasi atau prosedur tersimpan, dan Anda tidak memvalidasinya dengan benar.
Kiat #6:Nilai Awal tidak boleh Lebih Besar dari Nilai Akhir
Tidak ada juga yang akan dikembalikan jika kedua nilai bukan NULL, tetapi rentangnya dibalik. Ini contohnya.
SELECT
DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '01/30/2010' AND '01/01/2010';
Selain tanggal, ekspresi berikut juga tidak akan mengembalikan hasil:
- nilai ANTARA 100 DAN -200. Karena -200 lebih rendah dari 100.
- bekerja ANTARA 'Penjaga Kebun Binatang' DAN 'Akuntan'. Karena 'Z' lebih besar dari 'A'.
Kiat #7:Nilai Rentang Harus Jenis Data yang Sama
Terkadang, kontrol antarmuka pengguna memiliki keluaran yang tidak terduga. Atau kita baru saja mengambil properti yang salah. Dan jika kita tidak memeriksanya sebelum meneruskannya ke SQL Server, situasi seperti ini mungkin terjadi:
SELECT
DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010' AND 'Saturday, June 5, 2010'
AND Latitude = 41.995
AND Longitude = -87.9336;
Kesalahan konversi dari string karakter ke tanggal akan terjadi.
Jadi, pelajaran dari Kiat #5 hingga #7 adalah memvalidasi nilai awal dan akhir rentang .
Kiat #8:Gunakan NOT BETWEEN untuk Mengecualikan Nilai
Pertimbangkan contoh lain.
SELECT
MONTH(DateHour) AS [Month]
,round(AVG([Hourly_Heating_Degree_Hours]),2) AS AverageTemperature
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010 00:00' AND '06/30/2010 23:00'
AND DateHour NOT BETWEEN '05/01/2010 00:00' AND '05/31/2010 23:00'
AND Latitude = 41.995
AND Longitude = -87.9336
GROUP BY MONTH(DateHour);
Ini akan mengembalikan rata-rata bulanan dari Januari hingga Juni tetapi akan mengecualikan Mei. Tidak termasuk catatan untuk Mei 2010 dimungkinkan oleh NOT BETWEEN. Berikut hasil yang ditetapkan pada Gambar 4.
Gambar 4 . Hasil kumpulan kueri menggunakan NOT BETWEEN.
SQL ANTARA Dibandingkan dengan Operator Lain
Kiat #9:Gunakan IN jika Anda Membutuhkan Daftar dan Bukan Rentang
Operator IN menentukan apakah suatu nilai cocok dengan nilai apa pun dalam daftar atau subkueri. Sementara itu, menggunakan NOT IN memeriksa apakah suatu nilai tidak cocok.
Baik operator BETWEEN maupun IN memfilter data berdasarkan beberapa nilai. Namun perbedaannya terletak pada himpunan nilai yang dicocokkan. ANTARA menggunakan rentang. Tetapi IN menggunakan nilai yang dipisahkan koma dalam daftar atau baris dalam subkueri.
Periksa contoh di bawah ini.
SELECT
DateHour
,[Hourly_Heating_Degree_Hours]
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010' AND '06/5/2010 23:00'
AND [Hourly_Heating_Degree_Hours] IN (5.2, 6, 7, 3.7)
AND Latitude = 41.995
AND Longitude = -87.9336;
Lihatlah daftar nilai yang digunakan oleh IN. Itu tidak perlu menjadi daftar nilai yang meningkat. Nilai terakhir dalam daftar (3.7) juga merupakan yang terkecil di antara angka-angka tersebut.
Kiat #10:Pilih dari ANTARA atau>=dengan <=
Saat runtime, SQL Server mengonversi ANTARA menjadi>=dengan operator <=. Bagaimana kami tahu?
Lihat kode di bawah ini.
SELECT
DateHour
,AVG(Hourly_Heating_Degree_Hours) AS AverageTemp
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010 08:00' AND '01/01/2010 12:00'
GROUP BY DateHour;
SELECT
DateHour
,AVG(Hourly_Heating_Degree_Hours) AS AverageTemp
FROM TemperatureData
WHERE DateHour >= '01/01/2010 08:00'
AND DateHour <= '01/01/2010 12:00'
GROUP BY DateHour;
Kedua kueri akan memiliki hasil yang sama seperti pada Gambar 5.
Gambar 5 . Hasil disetel menggunakan ANTARA atau>=dengan <=.
Mereka juga memiliki rencana eksekusi yang sama, seperti yang terlihat pada Gambar 6.
Gambar 6 . Rencana eksekusi 2 kueri yang membandingkan penggunaan BETWEEN, dan>=dan <=operator.
Tapi inilah masalahnya.
Perhatikan Indeks pertama Cari operator pada Gambar 6. Kemudian, lihat Cari Predikat . Apakah Anda melihat kata kunci ANTARA? Tidak ada, kan? Karena diubah menjadi>=dengan operator <=. Itu adalah operator yang ada di Predikat Pencarian .
Tapi masih ada lagi.
Jika Anda mengarahkan mouse ke Pencarian Indeks second kedua operator, Anda akan melihat properti yang sama dengan Pencarian Indeks first pertama .
Jadi, sepertinya operator ANTARA adalah jalan pintas ke>=dengan <=operator . Anda akan mengetik lebih banyak jika Anda menggunakan yang terakhir. Anda akan melihat konversi yang sama terjadi ketika BETWEEN digunakan dalam angka dan string.
Pada akhirnya, terserah Anda jika Anda menggunakan ANTARA atau>=dan <=operator. Waktu konversi yang diperlukan untuk mengonversi ANTARA dapat diabaikan. Tetapi jika Anda masih tidak menginginkan waktu ekstra yang dapat diabaikan itu, gunakan operator>=dan <=.
Intinya
SQL BETWEEN bagus untuk mengambil data termasuk jangkauan. Dan itu tidak terlalu sulit untuk digunakan. Bahkan nilai DATETIME dapat dikelola dengan BETWEEN. Pastikan Anda menutupi porsi waktu dengan benar. Ini juga setara dengan menggunakan>=dengan <=. Terserah Anda ingin menggunakan yang mana.
Anda dapat menandai halaman ini untuk mendapatkan kiat SQL ANTARA tanggal, angka, dan string saat Anda membutuhkannya.
Jika Anda memiliki beberapa trik menggunakan ANTARA yang tidak kami bahas, Anda dapat membagikannya kepada kami di bagian Komentar. Dan jika Anda menyukai artikel ini, silakan bagikan dengan menekan tombol media sosial.
Selamat membuat kode, semuanya!