Sądząc po wynikach, wygląda na to, że zdefiniowałeś START_DATE jako znacznik czasu. Gdyby to była regularna data, Oracle byłaby w stanie obsłużyć niejawną konwersję. Ale ponieważ tak nie jest, musisz jawnie rzutować te ciągi na daty.
SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
2 /
Session altered.
SQL>
SQL> select * from t23
2 where start_date between '15-JAN-10' and '17-JAN-10'
3 /
no rows selected
SQL> select * from t23
2 where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
3 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
SQL>
Ale wciąż dostajemy tylko jeden rząd. Dzieje się tak, ponieważ START_DATE zawiera element czasu. Jeśli nie określimy składnika czasu, Oracle domyślnie ustawia go na północ. To jest w porządku dla od strona BETWEEN
ale nie na do strona:
SQL> select * from t23
2 where start_date between to_date('15-JAN-10')
3 and to_date('17-JAN-10 23:59:59')
4 /
WIDGET START_DATE
------------------------------ ----------------------
Small Widget 15-JAN-10 04.25.32.000
Product 1 17-JAN-10 04.31.32.000
SQL>
edytuj
Jeśli nie możesz przejść w składniku czasu, jest kilka możliwości. Jednym z nich jest zmiana klauzuli WHERE, aby usunąć element czasu z kryteriów:
where trunc(start_date) between to_date('15-JAN-10')
and to_date('17-JAN-10')
Może to mieć wpływ na wydajność, ponieważ dyskwalifikuje każdy indeks b-drzewa w dniu START_DATE. Zamiast tego musiałbyś zbudować indeks oparty na funkcjach.
Alternatywnie możesz dodać element czasu do daty w swoim kodzie:
where start_date between to_date('15-JAN-10')
and to_date('17-JAN-10') + (86399/86400)
Z powodu tych problemów wiele osób woli unikać używania between
sprawdzając granice dat w następujący sposób:
where start_date >= to_date('15-JAN-10')
and start_date < to_date('18-JAN-10')