Hola Huesos52:
Cita: Hacer to_date(to_char(fecha,'formato'),'formato') es equivalente a hacer fecha
Hay una pequeña pero a la vez gran diferencia al hacer este tipo de conversiones pues al parecer no tomas en cuenta que los campos tipo fecha TAMBIÉN ALMACENAN LA HORA. Supongamos que queremos obtener la diferencia en días entre el 04 de abril de 2011 hasta el día de hoy. Según tu razonamiento sería algo como esto:
Código SQL:
Ver originalSELECT sysdate - to_date('04/04/2011', 'DD/MM/YYYY') dias_de_diferencia FROM dual;
Código:
dias_de_diferencia
----------------------------
8.41927083333333333333333333333333333333
Este resultado es perfectamente correcto, es decir, no hay nada de malo en el cálculo, pero si haces lo siguiente
Código SQL:
Ver originalSELECT to_date(to_char(sysdate, 'DD/MM/YYYY'), 'DD/MM/YYYY') - to_date('04/04/2011', 'DD/MM/YYYY') dias_de_diferencia FROM dual;
El resultado de estas consultas sería
Código:
dias_de_diferencia
----------------------------
8
Es decir, al aplicar la doble conversión al SYSDATE "eliminamos" la parte de la hora a la fecha (en realidad se asigna 00:00:00.000) de tal manera que el resultado no presenta parte decimal. De esta manera creo que es claro que hacer to_date(to_char(fecha,'formato'),'formato')
NO ES EQUIVALENTE a hacer fecha.
La misma lógica aplicaría para los rangos. Si tuvieras por ejemplo en tu tabla la fecha
2011-04-12 12:04:24
y compararas simplemente que fecha >= sysdate, sólo sería verdadera después de las 12:04:23. Si te interesa SÓLO LA FECHA Y NO LA HORA tendrías que hacer la conversión a las dos partes de la comparación.
Estoy de acuerdo contigo en que la función TO_CHAR es la indicada para mostrar las fechas en el formato que quieras, pero en este caso también tiene otras aplicaciónes.
Esperemos los comentarios del compañero PabloJN.
Saludos
Leo.