Apakah kedua pertanyaan ini setara secara logis?
DECLARE @DateTime DATETIME = GETDATE()
Pertanyaan 1
SELECT *
FROM MyTable
WHERE Datediff(DAY, LogInsertTime, @DateTime) > 7
Pertanyaan 2
SELECT *
FROM MyTable
WHERE LogInsertTime < @DateTime - 7
Jika mereka tidak setara secara logis, dapatkah Anda memberi saya persamaan logis dari permintaan pertama sehingga klausa WHERE dapat menggunakan indeks secara efektif (mis. Menghilangkan pembungkus fungsi)?
LogInsertTime
ituJawaban:
Apakah dua pertanyaan yang Anda posting setara secara logis tidak relevan; Anda seharusnya tidak menggunakan keduanya. Saya akan mencoba untuk menjauhkan Anda dari beberapa hal:
LogDateTime
diindeks (atau mungkin pernah).Saya tidak suka matematika tanggal steno dan saya merekomendasikan untuk tidak melakukannya. Tentu, ini lebih cepat untuk mengetik, tetapi cobalah dengan
DATE
tipe data dan Anda akan mendapatkan kesalahan buruk. Jauh lebih baik untuk menjelaskannya, misalnya:sumber
Saya akan menggunakan permintaan isi ulang berikut:
Alasannya: Saya percaya bahwa hasil dari @ DateTime-7 tidak didokumentasikan. Bahkan jika itu kebetulan setara dengan DATEADD (DAY, -7, @DateTime), itu mungkin pecah dalam rilis nanti.
sumber
- (Subtract): Subtracts two numbers (an arithmetic subtraction operator). Can also subtract a number, in days, from a date.
. Namun, saya setuju bahwa menggunakan fungsi tanggal eksplisit membuat kueri yang dihasilkan lebih mudah dibaca dan dipelihara daripada "sihir operator aritmatika".Mereka tidak setara. Catatan yang 7 hari yang lalu, tetapi sebelum waktu saat ini hari - hanya akan dikembalikan dalam permintaan # 2:
Ketika membandingkan hari menggunakan
DATEADD
fungsi , itu tidak mengambil bagian waktu menjadi pertimbangan . Fungsi akan mengembalikan 1 ketika membandingkan hari Minggu & Senin, terlepas dari waktu.Demo:
Setara logis dari permintaan pertama yang akan memungkinkan penggunaan indeks potensial adalah dengan menghapus bagian waktu
@DateTime
atau mengatur waktu untuk0:00:00
:Alasan mengapa kueri pertama tidak dapat menggunakan indeks
LogInsertTime
adalah karena kolom dimakamkan dalam suatu fungsi. Kueri # 2 membandingkan kolom dengan nilai konstan yang memungkinkan pengoptimal untuk memilih indeksLogInsertTime
.sumber