Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Data Oracle Entre Consulta


A julgar pela sua saída, parece que você definiu START_DATE como um carimbo de data/hora. Se fosse uma data normal, o Oracle seria capaz de lidar com a conversão implícita. Mas como não é, você precisa converter explicitamente essas strings para serem datas.
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> 

Mas ainda temos apenas uma linha. Isso ocorre porque START_DATE tem um elemento de tempo. Se não especificarmos o componente de hora, o Oracle usará como padrão a meia-noite. Isso é bom para o de lado do BETWEEN mas não para o até lateral:
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>

editar

Se você não puder passar no componente de tempo, há algumas opções. Uma é alterar a cláusula WHERE para remover o elemento time dos critérios:
where trunc(start_date) between to_date('15-JAN-10') 
                            and to_date('17-JAN-10')

Isso pode afetar o desempenho, pois desqualifica qualquer índice b-tree em START_DATE. Em vez disso, você precisaria criar um índice baseado em função.

Alternativamente, você pode adicionar o elemento time à data em seu código:
where start_date between to_date('15-JAN-10') 
                     and to_date('17-JAN-10') + (86399/86400) 

Devido a esses problemas, muitas pessoas preferem evitar o uso de between verificando os limites de data como este:
where start_date >= to_date('15-JAN-10') 
and start_date < to_date('18-JAN-10')