Ojo con TO_DATE()…

Muchas veces trabajamos asumiendo comportamientos ‘intuitivos’ al funcionamiento funciones o procedimientos estándar. (Es lógico: si no fuera así, deberíamos estudiar exhaustivamente toda la documentación y de nada nos valdría cualquier tipo de ‘background’ obtenido con años y años de experiencia de uso de un determinado ‘software’ o de otros parecidos).
Así pues, muchas veces asumimos que cierto subprograma funcionará así ‘porque es lógico’.

Pero eso puede no ser cierto: Por ejemplo, TO_DATE() tiene un comportamiento un poco peculiar a la hora de decidir dónde truncar a partir del formato que se introduzca:

Si el formato llega hasta día, trunca a día (es decir, establece las 00:00:00):

carlos@db01.xxxxxx>  select TO_DATE('01012007','DDMMYYYY') from dual;

TO_DATE('01012007',
-------------------
01/01/2007 00:00:00

Si el formato llega hasta mes, trunca al primer día del mes (a las 00:00:00):

carlos@db01.xxxxxx>  select TO_DATE('012007','MMYYYY') from dual;

TO_DATE('012007','M
-------------------
01/01/2007 00:00:00

Pero si el formato llega sólo hasta el año: trunca al primer día del mes ACTUAL (esto es lo ‘contraintuitivo’: no truncar al primer día del año):

carlos@db01.xxxxxx>  select sysdate, TO_DATE('2006','YYYY') from dual;

SYSDATE             TO_DATE('2006','YYY
------------------- -------------------
17/07/2007 13:11:24 01/07/2006 00:00:00

En realidad hace eso cada vez que al formato le falta el mes:

carlos@db01.xxxxxx>  select SYSDATE, TO_DATE('032007','DDYYYY') from dual;

SYSDATE             TO_DATE('032007','D
------------------- -------------------
17/07/2007 13:12:53 03/07/2007 00:00:00

…o el año (si bien esto quizá es un poco más intuitivo: truncar al año actual)

carlos@db01.xxxxxx>  select SYSDATE, TO_DATE('0320','MMDD') from dual;

SYSDATE             TO_DATE('0320','MMD
------------------- -------------------
17/07/2007 13:15:43 20/03/2007 00:00:00

carlos@db01.xxxxxx> select SYSDATE, TO_DATE('20','DD') from dual;

SYSDATE             TO_DATE('20','DD')
------------------- -------------------
17/07/2007 13:27:38 20/07/2007 00:00:00

carlos@db01.xxxxxx> select sysdate, to_date('11:00:00','hh24:mi:ss')
2  from dual;

SYSDATE             TO_DATE('11:00:00',
------------------- -------------------
17/07/2007 13:31:12 01/07/2007 11:00:00

Ojo con esto, ya que podemos obtener resultados no esperados.

Saludos.

Carlos.

Anuncios

3 respuestas a Ojo con TO_DATE()…

  1. Hugo Santos dice:

    Gracias por tu ayuda es realmente lo que andaba buscando.

  2. Greg dice:

    Thanks man! ^-^

  3. raul dice:

    tengo la siguiente informacion (20/11/2007 03:34:46 p.m.) como es su formato? lo que tengo es solo (dd/mm/yyyy hh:mi:ss) y me falta el resto, Help

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: