ORA-01843 « not a valid month » : causes et solutions

ORA-01843 « not a valid month » : décalage de format de date, jour/mois inversés, langue NLS… comment corriger avec TO_DATE et un format explicite.

Illustration de l'erreur Oracle ORA-01843

ORA-01843 « not a valid month » survient quand Oracle convertit une chaîne en date et que le « mois » ne correspond pas au format attendu. Presque toujours, c’est un décalage de format (jour/mois inversés, mois en lettres, langue) entre votre chaîne et le paramètre NLS_DATE_FORMAT de la session. Voici comment régler ça proprement.

Publicité

Le message

ORA-01843: not a valid month
ORA-01843: un mois doit être spécifié

La cause profonde : la conversion implicite de date

Quand vous écrivez une date comme une chaîne, Oracle la convertit selon le NLS_DATE_FORMAT de la session — qui varie d’un environnement à l’autre :

-- ❌ dépend du NLS de la session → ORA-01843 selon le serveur
SELECT * FROM ventes WHERE date_vente = '12/06/2026';
SELECT to_date('2026-06-12') FROM dual;

Sur un serveur configuré en DD-MON-RR, '12/06/2026' est illisible → erreur de mois.

Solution 1 — Toujours spécifier le format (la bonne pratique)

-- ✅ format explicite, indépendant de la session
SELECT to_date('12/06/2026', 'DD/MM/YYYY') FROM dual;
SELECT * FROM ventes WHERE date_vente = to_date('12/06/2026','DD/MM/YYYY');

Voir notre tutoriel TO_DATE Oracle pour tous les masques de format.

Solution 2 — Utiliser un littéral DATE ANSI

-- format ISO imposé : AAAA-MM-JJ, sans ambiguïté
SELECT * FROM ventes WHERE date_vente = DATE '2026-06-12';

Solution 3 — Mois en lettres : gérer la langue (NLS)

-- ❌ 'janvier' échoue si la session est en anglais
SELECT to_date('12-janvier-2026','DD-MON-YYYY') FROM dual;
-- ✅ forcer la langue
SELECT to_date('12-janvier-2026','DD-MON-YYYY',
               'NLS_DATE_LANGUAGE=FRENCH') FROM dual;

Cause fréquente — jour et mois inversés

'06/13/2026' avec un format DD/MM/YYYY : le « 13 » tombe sur le mois → ORA-01843. Vérifiez l’ordre réel de vos données par rapport au masque utilisé.

Cause vicieuse — données « sales » dans une colonne VARCHAR2

Si les dates sont stockées en texte (mauvaise idée), une seule valeur mal formée casse toute la requête. Repérez-les :

-- Oracle 12c R2+
SELECT * FROM import WHERE VALIDATE_CONVERSION(d_txt AS DATE, 'DD/MM/YYYY') = 0;
-- conversion tolérante
SELECT to_date(d_txt DEFAULT NULL ON CONVERSION ERROR, 'DD/MM/YYYY') FROM import;

La cause est proche d’ORA-01722 (conversion ratée) — même réflexe : format explicite + données propres.

La vraie prévention

  • Stockez les dates dans des colonnes DATE ou TIMESTAMP, jamais en VARCHAR2.
  • Utilisez toujours TO_DATE(..., 'format') ou un littéral DATE 'YYYY-MM-DD'.
  • Côté application, passez des objets date (bind), pas des chaînes.

FAQ

Pourquoi la même requête marche sur un serveur mais pas l’autre ?

Le NLS_DATE_FORMAT (et NLS_DATE_LANGUAGE) diffère entre les sessions/environnements. Spécifier le format explicitement supprime cette dépendance.

Comment voir le format de date courant ?

SELECT value FROM nls_session_parameters WHERE parameter='NLS_DATE_FORMAT';

Quelle différence entre ORA-01843 et ORA-01861 ?

ORA-01843 : le mois est invalide (souvent jour/mois inversés). ORA-01861 (« literal does not match format string ») : la chaîne ne correspond pas du tout au masque. Les deux se règlent avec un format explicite.

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité