Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Problema con indices

Estas en el tema de Problema con indices en el foro de Oracle en Foros del Web. Hola En esta consulta tengo indexado el champo "fecha", pero como este campo se utiliza dentro de la funcion TO_DATE(TO_CHAR()) no se utilizan los indices. ...
  #1 (permalink)  
Antiguo 27/05/2009, 03:27
 
Fecha de Ingreso: mayo-2009
Mensajes: 38
Antigüedad: 12 años, 2 meses
Puntos: 1
Problema con indices

Hola

  1. En esta consulta tengo indexado el champo "fecha", pero como este campo se utiliza dentro de la funcion TO_DATE(TO_CHAR()) no se utilizan los indices.

    SELECT nombre, num_com, PU, num_prod, num_fac, tar, cantidad ,ciudad, TO_CHAR(fecha,'DD/MM/RRRR')
    FROM productos
    WHERE nombre = 'Antonio'
    AND num_prod = '5'
    AND PU IS NOT NULL
    AND num_com IS NOT NULL
    AND num_fac IS NOT NULL
    AND tar IS NOT NULL
    AND TO_DATE(TO_CHAR(fecha,'DD/MM/RR'),'DD/MM/RR') BETWEEN TO_DATE('01/04/09','DD/MM/RR') AND TO_DATE('01/05/09','DD/MM/RR')
    Como puedo solucionarlo ?

  2. Quiero convertir la fecha en numero:
    TO_DATE(TO_CHAR(fecha,'DD/MM/RR'),'DD/MM/RR') BETWEEN TO_DATE('01/04/09','DD/MM/RR') AND TO_DATE('01/05/09','DD/MM/RR')

    he intentado com lo siguiente, pero no funciona :

    TO_NUMBER(TO_CHAR(fecha,'DD/MM/RR'),'DD/MM/RR') BETWEEN TO_NUMBER('01/04/09','DD/MM/RR') AND TO_NUMBER('01/05/09','DD/MM/RR')


De anticipo muchas gracias
  #2 (permalink)  
Antiguo 27/05/2009, 06:31
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 14 años, 1 mes
Puntos: 43
Respuesta: Problema con indices

No entiendo nada.
SI el campo "fecha" es un date ¿ para que haces el TO_DATE del TO_CHAR de ese campo ?
¿ Así no te rula ? :

AND fecha BETWEEN to_date('01/04/2009','DD/MM/yyyy') AND TO_DATE('01/05/2009','DD/MM/yyyy')
ó

AND fecha BETWEEN '01/04/2009' and '01/05/2009'
  #3 (permalink)  
Antiguo 27/05/2009, 06:48
 
Fecha de Ingreso: mayo-2009
Mensajes: 38
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Problema con indices

con :

Cita:
Iniciado por jc3000 Ver Mensaje

AND fecha BETWEEN to_date('01/04/2009','DD/MM/yyyy') AND TO_DATE('01/05/2009','DD/MM/yyyy')
ó

AND fecha BETWEEN '01/04/2009' and '01/05/2009'
no me da ningun resultado
  #4 (permalink)  
Antiguo 27/05/2009, 07:25
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 13 años, 6 meses
Puntos: 11
Respuesta: Problema con indices

por qué al hacer el to_char pones ('RRRR') al referirte al año???

Cita:
SELECT nombre, num_com, PU, num_prod, num_fac, tar, cantidad ,ciudad, TO_CHAR(fecha,'DD/MM/RRRR')
FROM productos
WHERE nombre = 'Antonio'
AND num_prod = '5'
AND PU IS NOT NULL
AND num_com IS NOT NULL
AND num_fac IS NOT NULL
AND tar IS NOT NULL
AND TO_DATE(TO_CHAR(fecha,'DD/MM/RR'),'DD/MM/RR') BETWEEN TO_DATE('01/04/09','DD/MM/RR') AND TO_DATE('01/05/09','DD/MM/RR')
Yo haría la select asi:

Cita:
SELECT nombre, num_com, PU, num_prod, num_fac, tar, cantidad ,ciudad, fecha
FROM productos
WHERE nombre = 'Antonio'
and num_prod = '5' --si es un campo numerico, sin comillas
and PU IS NOT NULL
and num_com IS NOT NULL
and num_fac IS NOT NULL
and tar IS NOT NULL
and fecha BETWEEN TO_DATE('01/04/09','DD/MM/YY') AND TO_DATE('01/05/09','DD/MM/YY')
por cierto, esto funciona siempre y cuando hayas declarado el campo fecha como DATE

-segunda pregunta: Por qué quieres cambiar la fecha a número??? Qué resultado esperas obtener haciedno esto.

saludos
  #5 (permalink)  
Antiguo 27/05/2009, 08:07
 
Fecha de Ingreso: mayo-2009
Mensajes: 38
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Problema con indices

Al ejecutar la consulta asi:

Cita:
SELECT nombre, num_com, PU, num_prod, num_fac, tar, cantidad ,ciudad, TO_CHAR(fecha,'DD/MM/RRRR')
FROM productos
WHERE nombre = 'Antonio'
AND num_prod = '5'
AND PU IS NOT NULL
AND num_com IS NOT NULL
AND num_fac IS NOT NULL
AND tar IS NOT NULL
AND TO_DATE(TO_CHAR(fecha,'DD/MM/RR'),'DD/MM/RR') BETWEEN TO_DATE('01/04/09','DD/MM/RR') AND TO_DATE('01/05/09','DD/MM/RR')
me devuelve 8 filas como resultado

pero asi :

Cita:
SELECT nombre, num_com, PU, num_prod, num_fac, tar, cantidad ,ciudad, fecha
FROM productos
WHERE nombre = 'Antonio'
and num_prod = '5' --si es un campo numerico, sin comillas
and PU IS NOT NULL
and num_com IS NOT NULL
and num_fac IS NOT NULL
and tar IS NOT NULL
and fecha BETWEEN TO_DATE('01/04/09','DD/MM/YY') AND TO_DATE('01/05/09','DD/MM/YY')
se ejecuta sin problemas pero no devuelve nada

Cita:
-segunda pregunta: Por qué quieres cambiar la fecha a número??? Qué resultado esperas obtener haciedno esto
Quiero cambiar fecha a numeros para optimizar el tiempo de ejecucion porque comparar numeros cuesta poco tiempo que comparar fechas.
  #6 (permalink)  
Antiguo 27/05/2009, 09:43
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 13 años, 6 meses
Puntos: 11
Respuesta: Problema con indices

Hola libertad:

Varias cosas:
1- Por que cuadno haces el to date(fecha, 'dd/mm/RR') pones las R´s cuando te refieres al año ? No lo entiendo. Creo que deberías de poner YYYY
2- has comprobado si los 8 registros que devuelve tu consulta cumplen las condiciones??? Porque me da en la nariz que te está fallando lo de la fecha.
3- Volviendo a ver el tema, sigo pensando que debes de hacerlo como te indicaba antes. A lo mejor no te devuelve ningun valor porque no hay ningun valor que cumpla TODAS las condiciones juntas (si quieres muestranos los los 8 registros que te devuelve) (por cierto, verifica que efectivamente el campo fecha es DATE)

Y respecto a tu pregunta de pasar a numero.
Una fecha NO se puede pasar a numero así como así. Si quieres hacerlo tienes dos opciones:

1- pasarla a segundos (entonces tendras un numero) yo esto no te lo aconsejo
2- Y la segunda es pasar a numero el char de una fecha, es decir:
to_number(to_char(fecha, 'yyyymmdd')). Esta opcion tiene la pega de que si tienes dos fechas iguales en las qeu la diferencia es la hora (hora, minutos, segudno), no vas a notar la diferencia.
De esa forma obtendras por ejemplo 20090527 (seria la echa de hoy) Además te recuerdo qeu tienes que hacerlo así, es decir, primero el año, luego el mes y luego los dias, porqeu si haces primero dia luego mes y luego año no serán correctas las comparaciones qeu harás.

Entendido??
A ver si ahroa te funciona todo!

Saludos
  #7 (permalink)  
Antiguo 27/05/2009, 09:57
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 12 años, 5 meses
Puntos: 360
Respuesta: Problema con indices

Cita:
1- Por que cuadno haces el to date(fecha, 'dd/mm/RR') pones las R´s cuando te refieres al año ? No lo entiendo.
RRRR también es un tipo de año. Miralo aca javi.
http://www.techonthenet.com/oracle/f...ns/to_date.php

Cita:
2- Y la segunda es pasar a numero el char de una fecha, es decir:
to_number(to_char(fecha, 'yyyymmdd')). Esta opcion tiene la pega de que si tienes dos fechas iguales en las qeu la diferencia es la hora (hora, minutos, segudno), no vas a notar la diferencia.
Libertad1. yo me iría también por esta solución. Ten muy en cuenta la opinión de javi_cassi, lo del orden de YYYYMMDD. Es de suma importancia.

En cuanto al rendimiento, no tengo mucha experiencia en oracle (apens estoy estudiando)
pero para que notes una diferencia en tiempo en comparar fechas y numeros, tendrías que estar hablando de un numero de registros excesivo.

Yo te ti, no le daría tantas vueltas a convertir las fechas a numeros.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 27/05/2009, 10:26
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 13 años, 6 meses
Puntos: 11
Respuesta: Problema con indices

Cita:
RRRR también es un tipo de año. Miralo aca javi.
http://www.techonthenet.com/oracle/f...ns/to_date.php
Mira que lo busqué y nada...

Muchas gracias, no sabía que había tantos
Karma donado
  #9 (permalink)  
Antiguo 28/05/2009, 01:52
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 14 años, 1 mes
Puntos: 43
Respuesta: Problema con indices

EL formato RR / RRRR creo que oracle lo sacó por el problema que se acercaba del "Efecto 2000".

En definitiva eso es una pequeña función que te devuelve los dos primeros digitos del año. Que dice que si el RR > 50 los dos primeros dígitos del año son 19 y si es < 50 los dos primeros digitos del año son 20.

Creo que era algo de eso
  #10 (permalink)  
Antiguo 28/05/2009, 04:45
 
Fecha de Ingreso: mayo-2009
Mensajes: 38
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Problema con indices

Muchas gracias a todos

con :

Cita:
to_number(to_char(fecha, 'yyyymmdd')).
funciona muy bien
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:47.