Oracle
 sql >> Database >  >> RDS >> Oracle

Data Oracle tra query

A giudicare dal tuo output, sembra che tu abbia definito START_DATE come timestamp. Se fosse una data normale, Oracle sarebbe in grado di gestire la conversione implicita. Ma poiché non è necessario eseguire il cast esplicito di quelle stringhe come date.

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> 

Ma abbiamo ancora solo una riga. Questo perché START_DATE ha un elemento temporale. Se non specifichiamo il componente temporale, Oracle lo imposta automaticamente a mezzanotte. Va bene per da lato del BETWEEN ma non per il fino a lato:

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>

modifica

Se non riesci a passare la componente temporale, ci sono un paio di scelte. Uno consiste nel modificare la clausola WHERE per rimuovere l'elemento time dai criteri:

where trunc(start_date) between to_date('15-JAN-10') 
                            and to_date('17-JAN-10')

Ciò potrebbe avere un impatto sulle prestazioni, perché squalifica qualsiasi indice b-tree in data START_DATE. Dovresti invece creare un indice basato su funzioni.

In alternativa puoi aggiungere l'elemento ora alla data nel tuo codice:

where start_date between to_date('15-JAN-10') 
                     and to_date('17-JAN-10') + (86399/86400) 

A causa di questi problemi molte persone preferiscono evitare l'uso di between controllando i limiti di data come questo:

where start_date >= to_date('15-JAN-10') 
and start_date < to_date('18-JAN-10')