to_date() como funciona?
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!!
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!!
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
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
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.
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.
