Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreur SQL rencontrée :ORA-01843 :mois non valide

'04/04/2012 13:35 PM' n'est pas une date - c'est une chaîne.

Oracle fera un implicite TO_DATE( string_value, format_mask ) sur les littéraux non-date lors de leur insertion dans un DATE colonne en utilisant la valeur de NLS_DATE_FORMAT paramètre de session comme masque de format (remarque :il s'agit d'un paramètre de session et appartient au client ; ce n'est pas un paramètre global ). Si le littéral non-date correspond à ce format, cela fonctionnera (et si ce n'est pas le cas, ce ne sera pas le cas) - cependant, si le NLS_DATE_FORMAT est déjà modifié, il se cassera immédiatement (cela peut être très pénible à déboguer car le code qui fonctionnait ne le fera pas, mais personne n'aura changé le code).

Vous pouvez trouver votre NLS_DATE_FORMAT actuel avec la requête :

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

Il est préférable d'utiliser explicitement TO_DATE() avec le masque de format correct ou d'utiliser un littéral de date ANSI/ISO (c'est-à-dire DATE '2012-04-04' ou TIMESTAMP '2012-04-04 13:35' ).

Vous pouvez faire :

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

(vous n'avez pas besoin du AM/PM car le composant heure est déjà sur une horloge de 24 heures)

ou

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

(en utilisant le littéral d'horodatage ANSI/ISO qu'Oracle convertira implicitement en une date)