to_date() como funciona?

chelo
04 de Marzo del 2004
Tengo la siguiente sentencia SQL: select count(cod_conex)
from conexiones
where (to_date(fecha_conex,'dd/mm/yy') BETWEEN to_date('02/03/2004','dd/mm/yy')-7 and to_date('02/03/2004','dd/mm/yy')-1)
Pero es lenta por lo que sigue despues del where (to_date(fecha_conex,'dd/mm/yy') . Al cambiarla solo por fecha_conex, anda mas rapido ¿Alguien sabe la razon?.....gracias!!

Adrian
04 de Marzo del 2004
Es más lento porque le estás diciendo al servidor que aplique la función to_date sobre fecha_conex, en cada registro, antes de hacer la comparación.

Si fecha_conex no es un campo de tipo fecha, deberás cambiarlo o el rendimiento se resentirá.

Si lo que quieres es que no tenga en cuenta la hora al hacer la comparación, es más rapida la función TRUNC:

WHERE TRUNC(FECHA_CONEX) BETWEEN ... etc

Pero ten en cuenta que el optimizador ignorará cualquier índice sobre fecha_conex. Si quieres indexar la columna, crea un índice sobre TRUNC(FECHA_CONEX) (sólo a partir de oracle 8).

Otra solución, que permitiría evitar el uso de indices basados en funciones, es hacer algo así:

where fecha_conex between to_date('01/11/2003 00:00', 'DD/MM/YYYY HH24:MI:SS') and to_date('7/11/2003 23:59', 'DD/MM/YYYY HH24:MI:SS')

Esto devolvería los registros entre el 01/11/2003 y el 07/11/2003.

Saludos

chelo
04 de Marzo del 2004
hola, gracias por responder.
pero tengo otra duda.
Primero. Probe la funcion trunc y es mas rapida pero no mas que si solo coloco fecha_conex.
Segundo. where fecha_conex between to_date('01/11/2003 00:00', 'DD/MM/YYYY HH24:MI:SS') and to_date('7/11/2003 23:59', 'DD/MM/YYYY HH24:MI:SS') me parece la mejor opcion, pero que pasa si no le coloco el formato de la hora? Probe algo sin la hora pero parece que me excluye el dia de inicio y el de fin de la consulta.


hngb
04 de Marzo del 2004
de que tipo es fecha_conex?