JANGAN tergoda untuk melakukan hal-hal seperti ini:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Ini cara yang lebih baik:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
lihat:Apa arti sebenarnya dari kata “SARGable”?
EDIT +Ada 2 alasan mendasar untuk menghindari penggunaan fungsi pada data dalam klausa where (atau dalam kondisi join).
- Dalam kebanyakan kasus, menggunakan fungsi pada data untuk memfilter atau menggabungkan menghilangkan kemampuan pengoptimal untuk mengakses indeks pada bidang tersebut, sehingga membuat kueri lebih lambat (atau lebih "mahal")
- Yang lainnya adalah, untuk setiap baris data yang terlibat setidaknya ada satu perhitungan yang dilakukan. Itu bisa menambahkan ratusan, ribuan, atau jutaan perhitungan ke kueri sehingga kami dapat membandingkan dengan satu kriteria seperti
2014-02-07
. Jauh lebih efisien untuk mengubah kriteria agar sesuai dengan data.
"Mengubah kriteria agar sesuai dengan data" adalah cara saya menjelaskan "gunakan SARGABLE
predikat"
Dan jangan gunakan keduanya.
praktik terbaik dengan rentang tanggal dan waktu adalah menghindari ANTARA dan selalu menggunakan formulir:
WHERE col>='20120101' AND col <'20120201' Formulir ini bekerja dengan semua jenis dan semua presisi, terlepas dari apakah bagian waktu dapat diterapkan.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)