ORA-01843 not a valid month

Descripción

Al hacer una operación SELECT sobre una tabla de una base de datos Oracle aparece el siguiente error:

ORA-01843: not a valid month

En particular hemos encontrado este caso en bases de datos Oracle 8, pero por las referencias se considera este problema transversal a la versión.

Causa

El problema se origina cuando la tabla tiene almacenada una fecha en un formato que el cliente no es capaz de entender debido a diferencias de formato.

Por ejemplo, la tabla puede estar almacenando las fechas como “DD-MM-YY”, es decir, día-mes-año (formato europeo) mientras que el cliente intenta leer la fecha como “MM-DD-YY” o viceversa. En este caso típico vemos que el número del mes es confundido con el del día, por lo que fácilmente existirán fechas que intentan leerse como teniendo un mes mayor que 12.

Solución

Una solución a este problema es indicar al cliente el formato correcto de fechas a ser usado. Esto se encuentra en una serie de valores de la sesión Oracle. Parte de estos valores pueden ser comprobados con la siguiente consulta:

select * from nls_session_parameters

Dentro de los resultados obtenidos vemos el valor de NLS_DATE_FORMAT que indica el formato que está siendo usado por el cliente.

Para cambiar el formato de las fechas se utiliza la siguiente consulta:

alter session set nls_date_format ='DD-MM-RR'

Esto tendrá efecto sólo por la sesión actual. En el ejemplo vemos que el formato está siendo cambiado a “dia-mes-año”. Las RR, contra lo que intuitivamente podría pensarse, están indicando el año en la consulta.