sql >> Base de Datos >  >> RDS >> Oracle

No es un mes válido en un extracto INSERT

A menos que tenga un activador en la tabla que esté configurando una columna de fecha o marca de tiempo, lo que daría alguna indicación en la pila de errores completa, parece que su NLS_DATE_LANGUAGE no espera una abreviatura de mes en inglés.

Lo que tienes es válido en inglés:

alter session set nls_timestamp_format = 'RR/MM/DD HH24:MI:SSXFF';
alter session set nls_date_language ='ENGLISH';

select to_timestamp('15-APR-14 01.36.58.803000000 PM',
  'DD-MON-RR HH.MI.SS.FF AM') as my_date
from dual;

MY_DATE                   
---------------------------
14/04/15 13:36:58.803000000 

Pero si el idioma de fecha predeterminado de su sesión es polaco (adivinando de su perfil), dará este error, con el mensaje de error todavía en inglés:

alter session set nls_date_language ='POLISH';

select to_timestamp('15-APR-14 01.36.58.803000000 PM',
  'DD-MON-RR HH.MI.SS.FF AM') as my_date
from dual;

SQL Error: ORA-01843: not a valid month
01843. 00000 -  "not a valid month"

Si no desea configurar su sesión en inglés, puede anularlo para una declaración específica dando el tercer parámetro opcional a to_timestamp() :

alter session set nls_date_language ='POLISH';

select to_timestamp('15-APR-14 01.36.58.803000000 PM',
  'DD-MON-RR HH.MI.SS.FF AM',
  'NLS_DATE_LANGUAGE=ENGLISH') as my_date
from dual;

MY_DATE                   
---------------------------
14/04/15 13:36:58.803000000 

También puede evitar el problema por completo usando números de meses en lugar de nombres de meses, o usando la sintaxis literal de marca de tiempo ANSI:

select timestamp '2014-04-15 13:36:58.803' from dual;

TIMESTAMP'2014-04-1513:36:58.803'
---------------------------------
14/04/15 13:36:58.803000000       

Estos métodos también funcionan para columnas de fecha; el to_date() la función se ve afectada por la configuración de NLS de la misma manera y tiene el mismo parámetro de idioma de fecha opcional.