
TO_CHAR Oracle : Convertir des Dates et Nombres en Chaîne SQL
La fonction TO_CHAR Oracle est l’une des fonctions de conversion les plus utilisées en SQL Oracle. Elle permet de transformer une date, un nombre ou un horodatage en chaîne de caractères selon un format défini. Maîtriser TO_CHAR est indispensable pour formater des rapports, afficher des données lisibles et interfacer Oracle avec des applications métier.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
📌 À lire aussi : TO_DATE Oracle : convertir une chaîne en date
Définition et utilisation de TO_CHAR en Oracle
La fonction TO_CHAR appartient à la famille des fonctions de conversion Oracle. Son rôle principal est de convertir une valeur de type DATE, NUMBER, TIMESTAMP ou INTERVAL en une chaîne de caractères (VARCHAR2), en appliquant un masque de formatage précis.
Cas d’usage en entreprise
En environnement professionnel, TO_CHAR est omniprésente dans les situations suivantes :
- Génération de rapports financiers : afficher un montant avec le symbole monétaire et les séparateurs de milliers (
1 250 000,00 €). - Exports de données : formater une date Oracle au format attendu par un ERP ou un fichier CSV (
DD/MM/YYYY). - Tri et regroupement : extraire l’année ou le mois d’une date pour réaliser des agrégations temporelles dans des tableaux de bord.
- Affichage conditionnel : présenter un numéro de compte, un code postal ou un identifiant avec des zéros de remplissage (
0042).
Syntaxe de TO_CHAR Oracle
La fonction TO_CHAR accepte deux signatures principales selon le type de donnée à convertir :
Pour les dates et horodatages
TO_CHAR( date_value, 'format_mask' [, 'nls_params'] )Pour les nombres
TO_CHAR( number_value, 'format_mask' [, 'nls_params'] )Description des paramètres
- date_value / number_value : la valeur source à convertir. Il peut s’agir d’une colonne de table, d’une constante ou d’une expression.
- ‘format_mask’ : le masque de format qui définit la représentation souhaitée en sortie. Ce paramètre est sensible à la casse pour certains formats de date (
MMvsmm). - ‘nls_params’ (optionnel) : paramètres NLS permettant de définir la langue, le séparateur décimal ou le symbole monétaire. Exemple :
'NLS_DATE_LANGUAGE=FRENCH'.
Principaux masques de format pour les dates
| Masque | Description | Exemple de résultat |
|---|---|---|
| DD | Jour du mois (01-31) | 07 |
| MM | Mois en numérique (01-12) | 06 |
| MONTH | Nom complet du mois | JUIN |
| MON | Abréviation du mois | JUN |
| YYYY | Année sur 4 chiffres | 2024 |
| HH24 | Heure au format 24h | 14 |
| MI | Minutes | 35 |
| SS | Secondes | 09 |
| DAY | Nom complet du jour | LUNDI |
| DY | Abréviation du jour | LUN |
| Q | Numéro du trimestre | 2 |
Principaux masques de format pour les nombres
| Masque | Description | Exemple de résultat |
|---|---|---|
| 9 | Chiffre (supprime les zéros non significatifs) | 1250 |
| 0 | Chiffre avec zéro de remplissage | 001250 |
| . | Séparateur décimal | 1250.00 |
| , | Séparateur de milliers | 1,250 |
| L | Symbole monétaire local | €1250 |
| FM | Supprime les espaces et zéros superflus (Fill Mode) | 1250 |
Exemples pratiques de TO_CHAR en SQL Oracle
Exemple 1 – Formatage de dates dans un contexte RH
Dans ce premier exemple, une entreprise souhaite générer un rapport listant les employés avec leur date d’embauche formatée en français, ainsi que l’année d’embauche pour des calculs d’ancienneté.
-- Récupération des employés avec leur date d'embauche formatée
SELECT
emp_id,
nom,
prenom,
-- Affichage de la date au format français : 07/06/2019
TO_CHAR(date_embauche, 'DD/MM/YYYY') AS date_embauche_fr,
-- Extraction de l'année uniquement pour calculer l'ancienneté
TO_CHAR(date_embauche, 'YYYY') AS annee_embauche,
-- Affichage du mois en toutes lettres en français
TO_CHAR(date_embauche, 'MONTH', 'NLS_DATE_LANGUAGE=FRENCH') AS mois_embauche
FROM employes
WHERE statut = 'ACTIF'
ORDER BY date_embauche DESC;
Résultat attendu (exemple) :
EMP_ID | NOM | PRENOM | DATE_EMBAUCHE_FR | ANNEE_EMBAUCHE | MOIS_EMBAUCHE
-------+----------+--------+------------------+----------------+--------------
1042 | MARTIN | Sophie | 15/03/2022 | 2022 | MARS
1031 | DUPONT | Luc | 07/06/2019 | 2019 | JUIN
Exemple 2 – Formatage de montants dans un contexte comptable
Le service comptable souhaite afficher les montants des factures avec séparateurs de milliers, deux décimales et le symbole monétaire, tout en évitant les espaces parasites grâce au modificateur FM.
-- Affichage des factures avec montant formaté pour un rapport comptable
SELECT
facture_id,
client_nom,
-- Format avec séparateur de milliers et 2 décimales
TO_CHAR(montant_ht, '999G999G990D00', 'NLS_NUMERIC_CHARACTERS='', ''') AS montant_formate,
-- Numéro de facture sur 8 chiffres avec zéros de remplissage
TO_CHAR(facture_id, 'FM00000000') AS numero_facture,
-- Date d'émission avec heure
TO_CHAR(date_emission, 'DD/MM/YYYY HH24:MI') AS date_heure_emission
FROM factures
WHERE EXTRACT(YEAR FROM date_emission) = 2024
ORDER BY date_emission;
Résultat attendu (exemple) :
FACTURE_ID | CLIENT_NOM | MONTANT_FORMATE | NUMERO_FACTURE | DATE_HEURE_EMISSION
-----------+------------+-----------------+----------------+--------------------
528 | ACME Corp | 12 500,00 | 00000528 | 14/01/2024 09:30
529 | Globex | 3 750,75 | 00000529 | 15/01/2024 14:15
Erreurs courantes avec TO_CHAR Oracle
Erreur : ORA-01481 – Invalid number format model
Cette erreur survient lorsque le masque de format numérique est incorrect ou incompatible avec la valeur fournie.
Code erroné :
-- Utilisation incorrecte d'un masque de date pour un nombre
SELECT TO_CHAR(125000, 'DD/MM/YYYY') FROM dual;
-- Résultat : ORA-01481: invalid number format model
Solution : Vérifiez toujours que le masque de format correspond au type de la valeur source. Utilisez un masque numérique pour un NUMBER et un masque de date pour une DATE. En cas de doute, testez d’abord sur DUAL :
-- Test rapide du masque avant intégration dans une requête complexe
SELECT TO_CHAR(125000, '999G999G990D00') FROM dual;
-- Résultat : 125 000,00
Autre erreur fréquente : confondre le masque MI (minutes) avec mm dans un contexte de date. Oracle étant sensible à la casse sur certains formats, utilisez toujours les masques en majuscules (MM pour le mois, MI pour les minutes) afin d’éviter les résultats inattendus.
Résumé
| Point clé | Détail |
|---|---|
| Fonction | TO_CHAR Oracle – Conversion vers VARCHAR2 |
| Types supportés | DATE, NUMBER, TIMESTAMP, INTERVAL |
| Paramètre clé | Le masque de format (format_mask) |
| Paramètre optionnel | nls_params pour la langue et les séparateurs |
| Modificateur FM | Supprime les espaces et zéros superflus |
| Erreur fréquente | ORA-01481 : masque incompatible avec le type source |
| Usage typique | Rapports, exports, agrégations temporelles, affichage métier |
Bonnes pratiques Oracle
- Toujours spécifier le masque explicitement : ne jamais laisser Oracle appliquer le format NLS par défaut dans les requêtes de production. Un masque implicite peut varier selon la session ou le serveur, entraînant des résultats incohérents selon les environnements.
- Utiliser TO_CHAR côté présentation, pas dans les jointures : évitez d’appliquer
TO_CHARsur des colonnes utilisées dans les clausesWHEREouJOIN, car cela désactive l’utilisation des index et dégrade les performances. Réservez la conversion pour la couche d’affichage (SELECT).
Aller plus loin
Pour approfondir votre maîtrise des fonctions de conversion et de formatage en SQL Oracle, nous vous recommandons ces articles complémentaires :
- TO_DATE Oracle : convertir une chaîne de caractères en date SQL – la fonction inverse de TO_CHAR, indispensable pour les imports et comparaisons de dates.
- TO_NUMBER Oracle : convertir une chaîne en valeur numérique – apprenez à transformer vos données textuelles en nombres exploitables pour vos calculs.
- Paramètres NLS Oracle : gérer la langue et les formats régionaux – maîtrisez les paramètres NLS pour adapter vos affichages selon les pays et les conventions locales.
Questions fréquentes
Comment formater une date en Oracle avec TO_CHAR ?
TO_CHAR(SYSDATE, 'DD/MM/YYYY') renvoie la date au format français. Les modèles courants : DD (jour), MM (mois), YYYY (année), HH24:MI:SS (heure).
Comment afficher le mois en lettres et en français ?
TO_CHAR(SYSDATE, 'DD Month YYYY', 'NLS_DATE_LANGUAGE=FRENCH') renvoie par exemple « 15 Janvier 2026 ».
Comment formater un nombre avec TO_CHAR ?
TO_CHAR(1234.5, '9G999D99') renvoie « 1 234,50 » selon les paramètres NLS ; FM supprime les espaces de remplissage : TO_CHAR(0.5, 'FM990D00') → « 0,50 ».
Sur le même thème
- SYSDATE Oracle : Guide Complet avec Exemples SQL
- ADD_MONTHS Oracle : fonction SQL pour les dates
- Fonctions analytiques SQL Oracle – Guide complet
- Fonctions d’agrégation SQL Oracle – Guide complet
- ROW_NUMBER Oracle : fonction analytique SQL expliquée
- MONTHS_BETWEEN Oracle : calcul de mois entre deux dates
