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

Encontrando un error de SQL:ORA-01843:no es un mes válido

'04/04/2012 13:35 PM' no es una fecha, es una cadena.

Oracle hará un implícito TO_DATE( string_value, format_mask ) en literales que no son de fecha al insertarlos en un DATE columna usando el valor de NLS_DATE_FORMAT parámetro de sesión como máscara de formato (nota:este es un parámetro de sesión y pertenece al cliente; no es una configuración global ). Si el literal que no es de fecha coincide con este formato, funcionará (y si no es así, no funcionará); sin embargo, si el NLS_DATE_FORMAT se cambia alguna vez, entonces se romperá inmediatamente (cualquiera que sea un gran dolor para depurar ya que el código que estaba funcionando no lo hará, pero nadie habrá cambiado el código).

Puede averiguar su NLS_DATE_FORMAT actual con la consulta:

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

Es mejor usar explícitamente TO_DATE() con la máscara de formato correcta o para usar un literal de fecha ANSI/ISO (es decir, DATE '2012-04-04' o TIMESTAMP '2012-04-04 13:35' ).

Puedes hacer:

INSERT INTO STORE ( id, opening_time )
  VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );

(no necesita el AM/PM ya que el componente de la hora ya está en un reloj de 24 horas)

o

INSERT INTO STORE ( id, opening_time )
  VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );

(utilizando el literal de marca de tiempo ANSI/ISO que Oracle convertirá implícitamente en una fecha)