lunes, 25 de abril de 2011

Bad Types (confusión con TO_CHAR, TO_DATE y tipos de dato)

Siempre he pensado que éste tema merece un póster...

Bad TypePor alguna razón, que debería ser motivo de reflexión, los formatos de fecha y especialmente el uso de las funciones TO_CHAR y TO_DATE suelen ser motivo de confusión...

Aunque lo he explicado ya unas pocas veces en persona, una consulta en la Comunidad de Oracle Hispana ha propiciado que escriba unas lineas sobre el tema...

No es el único caso, pero por lo que he visto el problema viene cuando se quieren comparar uno o varios campos y hay fechas por medio. Para empezar hay que dejar algo claro, cuando comparamos dos elementos deberían ser del mismo tipo, nada de peras con manzanas.

Es por eso que lo primero es revisar los Tipos de Dato en Oracle.

Pero no siempre lo tenemos todo fácil, o simplemente no le podemos pedir a un usuario que escriba día, mes, año, minuto, segundo (que es lo que incluye el tipo DATE en Oracle) en el formulario de nuestra aplicación, para buscar las facturas del mes pasado. Es por es eso que existen las funciones TO_CHAR y TO_DATE; pero vayamos al grano:

Si el campo es fecha y queremos los resultados anteriores al día 3 de enero de 2011, bastará con convertir la cadena '03/01/2011' a formato fecha de Oracle, el se encarga de completar hora, minutos y segundos con ceros:

WHERE campo_fecha < to_date('03/01/2011','DD/MM/YYYY')

Si el campo es una cadena de carácteres:

WHERE to_date(campo_cadena,'DD/MM/YYYY') < to_date('03/01/2011','DD/MM/YYYY')

Pero Oracle en contadas ocasiones realiza conversiones implícitas, por lo que es posible utilizar:

WHERE campo_fecha < '03/01/2011'

Pero lo recomendable es que controlemos nosotros las conversiones.

En otras ocasiones si queremos los resultados anteriores a un año y el campo es fecha, se puede utilizar:

WHERE to_char(campo_fecha,'YYYY')< '2011'

Extraemos del tipo DATE unicamente la información del año, y la comparamos con una cadena entrecomillada.

Es un tema sencillo, pero espero que le sirva a alguien. Para más detalles os dejo un enlace que comentaba Diego en la @cohispana : Funciones integradas de PL/SQL

Imagen: Bad Type

No hay comentarios: