SORU: SQL'in ARASINDAKİ ARASINDAKİ NEDİR?
CEVAP: Çünkü SQL dili tasarımcıları, zayıf bir tasarım kararı verdiler, çünkü geliştiricilerin BETWEEN'in 4 türevinden hangisini (kapalı, yarı açık-sol, yarı-açık-açık veya açık) belirtmesine izin verecek sözdizimi sunmadılar. ) tercih ederlerdi.
ÖNERİ: SQL standardı değiştirilinceye kadar / sürece, tarih / saatler için BETWEEN kullanmayın. Bunun yerine, BETWEEN ürün yelpazenizin başlangıç ve bitiş sınırlarında bağımsız koşullar olarak DATE aralığı karşılaştırmalarını kodlama alışkanlığını edinin. Bu biraz ayrıntılı, ancak sezgisel (dolayısıyla daha az hatalu olması muhtemel olan) yazma koşullarını bırakacak ve en uygun yürütme planlarının belirlenmesini ve endekslerin kullanılmasını sağlayan veritabanı optimizerlerine açıklık getirecektir.
Örneğin, sorgunuz bir giriş günü şartnamesini kabul ediyorsa ve o tarihe düşen tüm kayıtları iade etmeli, aşağıdaki gibi kodlarsınız:
WHERE DATE_FIELD >= :dt AND DATE_FIELD < :dt+1
BETWEEN kullanarak mantığı yazmaya çalışmak performans sorunları ve / veya buggy kodu ile tehlikeye girer. Üç yaygın yanlış adım:
1) WHERE DATE_FIELD BETWEEN :dt AND :dt+1
Bu neredeyse kesin bir hatadır - kullanıcı sadece belirli bir tarih için kayıtları görmeyi bekler, ancak bir gün ertesi gün saat 12: 00'den itibaren kayıtları içeren bir raporla sonuçlanır.
2) WHERE TRUNC(DATE_FIELD) = :dt
Doğru cevap verir, ancak işlevi DATE_FIELD uygulamasına uygulamak çoğu indeksleme / istatistiği işe yaramaz hale getirir (bazen DBA'lar tarih alanlarına işlev tabanlı dizinler ekleyerek yardım etmeye çalışacaktır - yine de çalışma saatlerini ve disk alanını yakıp IUD'ye ek yük masadaki işlemler)
3) WHERE EVENT_DATE BETWEEN :dt AND :dt + 1-1/24/60/60
Oracle gurusu extraordinaire Tom Kyte, bu zariften daha küçük (IMO) çözümü önerir. "1-1 / 24/06/60" 'ı bulmak için bütün gününü harcayana kadar ya da eksik sonuçlar veren bir sorguda ... ya da yanlışlıkla bir TIMESTAMP alanında kullanana kadar harika çalışıyor. Ayrıca, biraz tescilli; Oracle'ın DATE veri türüyle uyumludur (ikinciyi takip eder), ancak farklı veritabanı ürünlerinin DATE / TIME hassasiyetine göre ayarlanması gerekir.
ÇÖZÜM: KAPALI / İÇERİK varsayılanına alternatiflerin belirtilmesini desteklemek için BETWEEN sözdizimini değiştirerek SQL dil özelliklerini geliştirmek için ANSI SQL komitesine dilekçe verin. Böyle bir şey hile yapar:
ifade1 ARASINDAKİ ifade2 [ DAHİL [USIVE] | EXCL [USIVE]] VE expr3 [ DAHİL [USIVE] | EXCL [KULLANIM]
Bunu ifade etmenin ne kadar kolay olduğunu düşünün WHERE DATE_FIELD BETWEEN :dt INCLUSIVE AND :dt+1 EXCLUSIVE
(veya sadece WHERE DATE_FIELD BETWEEN :dt AND :dt+1 EXCL
)
Belki ANSI SQL: 2015?