Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Encontrando o erro SQL:ORA-01843:não é um mês válido


'04/04/2012 13:35 PM' não é uma data - é uma string.

O Oracle fará um TO_DATE( string_value, format_mask ) implícito em literais sem data ao inseri-los em um DATE coluna usando o valor do NLS_DATE_FORMAT parâmetro de sessão como a máscara de formato (nota:este é um parâmetro de sessão e pertence ao cliente; não é uma configuração global ). Se o literal sem data corresponder a esse formato, ele funcionará (e se não funcionar, não funcionará) - no entanto, se o NLS_DATE_FORMAT for alterado, ele será interrompido imediatamente (qualquer um será uma grande dor para depurar, pois o código que estava funcionando não, mas ninguém terá alterado o código).

Você pode descobrir seu NLS_DATE_FORMAT atual com a consulta:
SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

É melhor usar explicitamente TO_DATE() com a máscara de formato correta ou para usar um literal de data ANSI/ISO (ou seja, DATE '2012-04-04' ou TIMESTAMP '2012-04-04 13:35' ).

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

(você não precisa do AM/PM pois o componente de hora já está em um relógio de 24 horas)

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

(usando o literal de carimbo de data/hora ANSI/ISO que o Oracle converterá implicitamente em uma data)