
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.
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
DATEouTIMESTAMP, jamais en VARCHAR2. - Utilisez toujours
TO_DATE(..., 'format')ou un littéralDATE '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.
