TRUNC Oracle : Tronquer des dates et nombres SQL

Découvrez la fonction TRUNC Oracle : syntaxe complète, exemples pratiques sur les dates et les nombres, erreurs courantes et bonnes pratiques SQL Oracle.

Illustration du tutoriel SQL Oracle : TRUNC Oracle : Tronquer des dates et nombres SQL

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.

Publicité

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 DATE afin 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 DATE ou TIMESTAMP à 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).
Publicité

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_HTMONTANT_2_DECIMALESMONTANT_ENTIERMONTANT_CENTAINES
1587,4561587,4515871500

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é

AspectTRUNC nombreTRUNC date
SyntaxeTRUNC(n, décimales)TRUNC(d, format)
Valeur par défaut0 décimale (entier)Tronqué au jour (minuit)
Arrondi ?Non, jamaisNon, jamais
Formats courants0, 2, -1, -2…‘DD’, ‘MM’, ‘YYYY’, ‘Q’, ‘IW’
Cas d’usage typiqueMontants, statistiquesReporting, comparaisons de dates
Différence avec ROUNDToujours inférieur ou égalToujours antérieur ou égal

2 bonnes pratiques Oracle avec TRUNC

  1. É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).
  2. 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 :

Publicité

Laisser un commentaire

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

Publicité