2011-05-12 14 views
5

Bir Oracle veritabanında çalıştırılan aşağıdaki ifadeye sahibim.SQL BETWEEN çalışmıyor

SELECT br.Number 
    FROM Billing_History br 
WHERE TRUNC(br.History_Date) BETWEEN to_date('01-Jan-99', 'DD-Mon-YY HH:MI:SS') 
            AND to_date('11-May-99', 'DD-Mon-YY HH:MI:SS') 

Bu tabloda, bu tarihler arasında kalan kayıtlar kesinlikle vardır. Ve hepsinin onlarla birlikte giden bir Numarası var, ama bir sebepten dolayı bu herhangi bir Sayı döndürmüyor. Hiç bir şey dönmüyor.

Veritabanındaki tarihler '01 -Jan-11 'biçimindedir. Öyleyse tarihleri ​​doğru biçimde koyuyorum gibi görünüyor. Yazdığım SQL'de yanlış bir şey görüyor musunuz?

+3

01-Jan-11'in 01-Jan-99 ve 11-May-99 arasında nasıl olduğunu göremiyorum ... –

+2

Ne tür sütun br.History_Date? –

+1

@Daniel Hilgarth, tarihlerin içinde bulunduğu formatı gösteren bir örnektir. Bu kesin tarih değildir. Sütun tipi Tarihtir. – Graham

cevap

11

sorun biçimi modelinin zamanı bileşeni olmadığı için bu tarihleri ​​toplamaksa değil 1999 Bunu göstermek için deneyin: yıl için bir biçim modeli bileşeni olarak

SQL> SELECT to_char(to_date('01-Apr-99','DD-Mon-YY'),'DD-Mon-YYYY') thedate 
     FROM dual; 

THEDATE 
----------- 
01-Apr-2099 

SQL> 

ya kullanım RR veya YYYY 20. yüzyıl tarihleri ​​kullanarak.

Düzenleme: "veritabanında tarihleri ​​bu biçimde '01 -Jan-11' içindedir" Sen deyimi yapmak

Bu, Oracle'daki tarihlerin ortak fakat yanlış bir yorumudur. DATE alanları her zaman aynı internal format'da depolanır. Bu, format modelinin, verilerin dahili biçime/dönüştürülmesini dikte eden dönüştürme işlevlerinde nasıl kullanıldığıyla ilgilidir.

+2

+1: Sorun, ikiliden bir sorgu seçim listesindeki TO_DATE ifadeleri kullanılarak fark edileceği gibi bir sorundur. –

3

ikinci to_date parametresinden zaman parçası kaldırmayı deneyin: hatta

to_date('11-May-99', 'DD-Mon-YY') 

Ya da daha: Bu dil agnostik ve tahmin gerekmez gibi bu daha sağlamdır

to_date('11-05-1999', 'DD-MM-YYYY') 

yüzyıl.

5

RR'yi YY yerine tarih biçiminde kullanın. Muhtemelen, bu 2099 dönüştürülür sizin yıla anlamına geleceğini 'YY' bileşeni var, 2099 yerine 1999

SELECT br.Number FROM Billing_History br WHERE 
TRUNC(br.History_Date) BETWEEN to_date('01-Jan-99', 'DD-Mon-RR HH:MI:SS') 
AND to_date('11-May-99', 'DD-Mon-RR HH:MI:SS') 
+0

+1: Bu sorun - çiftten bir sorgu seçim listesindeki TO_DATE ifadeleri kullanılarak fark edileceği gibi. –