Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Data Oracle Między zapytaniem

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')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wstawić/zaktualizować większy rozmiar danych w tabelach Oracle?

  2. Liczba Oracle do C# dziesiętna

  3. oracle sql:zaktualizuj, jeśli istnieje, wstawiaj jeszcze

  4. Błąd SQL:ORA-01861:literał nie pasuje do ciągu formatu 01861

  5. Jak losowo pobrać rekordy z bazy danych Oracle?