
TRUNC Oracle : Tronquer des dates et des nombres en SQL
La fonction TRUNC Oracle est l’une des fonctions les plus utilisées en SQL Oracle pour tronquer des valeurs numériques ou des dates sans arrondir. Que vous travailliez sur des rapports financiers, des analyses de données temporelles ou des calculs de précision, maîtriser TRUNC Oracle est indispensable pour tout développeur ou administrateur de base de données souhaitant manipuler les données avec exactitude.
Définition et utilisation de TRUNC Oracle
La fonction TRUNC en Oracle est une fonction native qui permet de supprimer la partie décimale d’un nombre ou de ramener une date à une unité temporelle précise, sans effectuer d’arrondi. Elle se distingue de la fonction ROUND qui, elle, arrondit la valeur au plus proche.
En entreprise, TRUNC est utilisée dans de nombreux contextes :
- Finance et comptabilité : tronquer un montant calculé pour éviter les décimales parasites (ex. : afficher 199,00 € au lieu de 199,99 €).
- Reporting temporel : regrouper des transactions par jour, mois ou année en tronquant la partie heure d’une colonne
DATE. - Comparaisons de dates : neutraliser la composante horaire d’un champ
DATEafin de comparer deux dates indépendamment de leur heure. - Calculs statistiques : conserver uniquement la partie entière d’un résultat de division ou de moyenne.
Syntaxe de la fonction TRUNC Oracle
La fonction TRUNC possède deux formes selon qu’elle s’applique à un nombre ou à une date.
TRUNC sur un nombre
TRUNC( nombre [, décimales] )
- nombre : la valeur numérique à tronquer. Peut être une colonne, une constante ou une expression.
- décimales *(optionnel)* : le nombre de décimales à conserver. Par défaut, cette valeur est
0(suppression complète de la partie décimale). Une valeur négative tronque à gauche de la virgule.
TRUNC sur une date
TRUNC( date [, format ] )
- date : la valeur de type
DATEouTIMESTAMPà tronquer. - format *(optionnel)* : l’unité temporelle à laquelle tronquer la date. Valeurs courantes :
'DD'(jour),'MM'(mois),'YYYY'(année),'HH'(heure),'MI'(minute),'Q'(trimestre),'IW'(semaine ISO). Par défaut, si omis, la date est tronquée au jour (minuit).
Exemples pratiques de TRUNC Oracle
Exemple 1 – TRUNC sur des valeurs numériques (contexte comptable)
Imaginons une table FACTURES contenant des montants calculés avec plusieurs décimales. On souhaite afficher les montants tronqués à deux décimales pour la facturation, et tronqués à l’unité pour un rapport synthétique.
-- Table FACTURES avec des montants décimaux
-- On tronque à 2 décimales pour la facturation précise
-- On tronque à l'entier pour le rapport synthétique
-- On utilise une valeur négative pour tronquer aux dizaines
SELECT
montant_ht,
TRUNC(montant_ht, 2) AS montant_2_decimales, -- ex: 1587.456 → 1587.45
TRUNC(montant_ht, 0) AS montant_entier, -- ex: 1587.456 → 1587
TRUNC(montant_ht, -2) AS montant_centaines -- ex: 1587.456 → 1500
FROM factures
WHERE statut = 'VALIDE';
Résultat attendu pour un montant de 1587,456 :
| MONTANT_HT | MONTANT_2_DECIMALES | MONTANT_ENTIER | MONTANT_CENTAINES |
|---|---|---|---|
| 1587,456 | 1587,45 | 1587 | 1500 |
Exemple 2 – TRUNC sur des dates (contexte analytique)
Dans un entrepôt de données, on dispose d’une table COMMANDES avec une colonne DATE_COMMANDE de type DATE (incluant l’heure). On souhaite regrouper les ventes par mois et par trimestre, tout en filtrant uniquement les commandes passées depuis le début du mois courant.
-- Regroupement des ventes par mois et par trimestre
-- TRUNC(DATE_COMMANDE, 'MM') ramène toutes les dates au 1er du mois
-- TRUNC(DATE_COMMANDE, 'Q') ramène toutes les dates au 1er jour du trimestre
-- TRUNC(SYSDATE, 'MM') correspond au 1er jour du mois courant (heure = 00:00:00)
SELECT
TRUNC(date_commande, 'MM') AS premier_du_mois,
TRUNC(date_commande, 'Q') AS premier_du_trimestre,
COUNT(*) AS nb_commandes,
SUM(montant_total) AS chiffre_affaires
FROM commandes
WHERE date_commande >= TRUNC(SYSDATE, 'MM') -- depuis le 1er du mois en cours
GROUP BY
TRUNC(date_commande, 'MM'),
TRUNC(date_commande, 'Q')
ORDER BY premier_du_mois;
Cet exemple illustre parfaitement l’usage de TRUNC Oracle dans un contexte de Business Intelligence : en tronquant les dates, on élimine les heures et minutes, ce qui permet des regroupements cohérents et des comparaisons fiables entre périodes.
Erreurs courantes avec TRUNC Oracle
Erreur : ORA-01722 – Nombre non valide lors d’un TRUNC sur une chaîne
Une erreur fréquente consiste à appliquer TRUNC à une colonne de type VARCHAR2 qui contient des valeurs numériques stockées sous forme de texte. Oracle tente alors une conversion implicite, ce qui échoue dès qu’une valeur non numérique est rencontrée.
-- ❌ Erreur : la colonne CODE_MONTANT est de type VARCHAR2
-- Si elle contient 'N/A' ou une valeur non numérique → ORA-01722
SELECT TRUNC(code_montant, 2) FROM factures;
-- ORA-01722: nombre non valide
Solution : Utilisez la fonction TO_NUMBER combinée à REGEXP_LIKE ou la fonction VALIDATE_CONVERSION (disponible depuis Oracle 12c) pour filtrer les valeurs valides avant d’appliquer TRUNC :
-- ✅ Bonne pratique : valider la conversion avant TRUNC
SELECT TRUNC(TO_NUMBER(code_montant), 2) AS montant_tronque
FROM factures
WHERE VALIDATE_CONVERSION(code_montant AS NUMBER) = 1;
Résumé
| Aspect | TRUNC nombre | TRUNC date |
|---|---|---|
| Syntaxe | TRUNC(n, décimales) | TRUNC(d, format) |
| Valeur par défaut | 0 décimale (entier) | Tronqué au jour (minuit) |
| Arrondi ? | Non, jamais | Non, jamais |
| Formats courants | 0, 2, -1, -2… | ‘DD’, ‘MM’, ‘YYYY’, ‘Q’, ‘IW’ |
| Cas d’usage typique | Montants, statistiques | Reporting, comparaisons de dates |
| Différence avec ROUND | Toujours inférieur ou égal | Toujours antérieur ou égal |
2 bonnes pratiques Oracle avec TRUNC
- Évitez TRUNC dans les clauses WHERE sur des colonnes indexées. Appliquer
TRUNC(date_commande, 'MM') = TRUNC(SYSDATE, 'MM')sur une colonne indexée désactive l’index. Préférez une plage de dates explicite :date_commande >= TRUNC(SYSDATE, 'MM') AND date_commande < ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1). - Utilisez TRUNC(SYSDATE) comme référence de date du jour. Pour comparer des dates sans tenir compte de l’heure,
TRUNC(SYSDATE)retourne la date du jour à 00:00:00 et constitue une référence stable, reproductible et lisible dans vos requêtes.
Aller plus loin
Vous maîtrisez maintenant la fonction TRUNC Oracle. Pour approfondir vos compétences en manipulation de données SQL Oracle, nous vous recommandons les sujets suivants :
- La fonction ROUND Oracle : arrondir des nombres et des dates avec précision — découvrez comment arrondir vos valeurs au lieu de les tronquer, et quand choisir l’une ou l’autre approche.
- La fonction TO_DATE Oracle : convertir des chaînes de caractères en dates — apprenez à contrôler le format de vos dates pour éviter les erreurs de conversion fréquentes.
- La fonction SYSDATE Oracle : obtenir la date et l’heure système — comprenez comment combiner
SYSDATEavecTRUNCet d’autres fonctions de date pour des requêtes temporelles robustes.
