sql >> Base de Datos >  >> RDS >> Oracle

Fecha de Oracle entre consultas

A juzgar por su salida, parece que ha definido START_DATE como una marca de tiempo. Si fuera una fecha regular, Oracle podría manejar la conversión implícita. Pero como no lo es, debe convertir explícitamente esas cadenas en fechas.

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> 

Pero todavía solo obtenemos una fila. Esto se debe a que START_DATE tiene un elemento de tiempo. Si no especificamos el componente de hora, Oracle lo predetermina a medianoche. Eso está bien para el desde lado del BETWEEN pero no para el hasta lado:

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

Si no puede pasar el componente de tiempo, hay un par de opciones. Una es cambiar la cláusula WHERE para eliminar el elemento de tiempo de los criterios:

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

Esto podría tener un impacto en el rendimiento, ya que descalifica cualquier índice de árbol b el START_DATE. En su lugar, necesitaría crear un índice basado en funciones.

Alternativamente, podría agregar el elemento de tiempo a la fecha en su código:

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

Debido a estos problemas, muchas personas prefieren evitar el uso de between comprobando límites de fecha como este:

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