BIWORKS
Calculs de temps en DAX : quelle fonction choisir et comment l'utiliser

Calculs de temps en DAX : quelle fonction choisir et comment l'utiliser

Mis à jour le

Calculs de temps en DAX : quelle fonction choisir et comment l’utiliser

Carte titre illustrée sur les calculs temporels en DAX

Pour mesurer un écart entre deux dates, utilisez DATEDIFF. Pour décaler une période entière (mois précédent, année antérieure), utilisez EDATE, EOMONTH ou DATEADD. Pour construire des cumuls, des comparaisons YTD ou des fenêtres glissantes, utilisez les fonctions de time intelligence comme DATESYTD, DATESINPERIOD ou TOTALYTD, toujours en filtre dans CALCULATE. Le choix dépend d’une seule question : cherchez-vous une valeur unique, ou un ensemble de dates à appliquer comme contexte ?


En bref:

  • Les fonctions DATEDIFF comptent les frontières calendaires, pas la durée réelle en jours ou en années, ce qui peut produire des résultats inattendus.

  • Utilisez CALCULATE avec des fonctions de time intelligence comme DATESYTD ou DATESINPERIOD pour éviter les erreurs liées aux contextes de filtre.

  • La création d’une table de dates fiable et son marquage sont essentiels pour que les calculs temporels fonctionnent correctement dans Power BI.

  • Privilégiez les variables pour stocker les ensembles de dates générés par des fonctions de time intelligence afin de garantir la lisibilité et la performance des mesures.

  • Pour garantir la fiabilité en production, testez toujours vos mesures avec des dates limites comme le premier et le dernier jour de l’exercice ou d’une année bissextile.


Table des matières

Panorama des fonctions DAX de date et d’heure

Avant de choisir une fonction, il faut savoir ce qu’elle retourne. Certaines donnent une valeur unique (un scalaire), d’autres renvoient une table de dates qu’on utilise ensuite comme filtre. Confondre les deux est la source numéro un des erreurs en calculs temps DAX.

Voici les fonctions les plus utiles au quotidien, classées par type de retour :

  • DATE(année, mois, jour) : retourne une valeur date. Utile pour construire une date de référence dans une mesure.

  • DATEDIFF(date1, date2, unité) : retourne un entier scalaire, le nombre de frontières franchies entre deux dates.

  • EDATE(date, mois) : retourne la date décalée d’un nombre de mois donné, en conservant le jour du mois quand c’est possible.

  • EOMONTH(date, mois) : retourne le dernier jour du mois, décalé ou non.

  • NOW() et TODAY() : retournent respectivement l’horodatage courant et la date du jour, sans argument.

  • YEARFRAC(date1, date2) : retourne la fraction d’année entre deux dates, en valeur décimale.

  • NETWORKDAYS(début, fin) : retourne le nombre de jours ouvrés, hors week-ends (et jours fériés si on lui fournit une table).

  • HOUR(), MINUTE(), SECOND(), WEEKNUM() : extraient un composant précis d’une date ou d’un horodatage.

Un exemple simple : Anciennete = DATEDIFF(Clients[DateInscription], TODAY(), YEAR) donne l’ancienneté en années complètes d’un client, en un seul appel.

Scalaire ou time intelligence : la règle qui évite 90 % des erreurs

Une fonction scalaire renvoie une valeur, point final. Une fonction de time intelligence renvoie une table de dates, qui ne prend son sens que combinée à CALCULATE. C’est cette distinction, documentée par DAX Patterns, qui explique pourquoi tant de mesures « qui devraient marcher » retournent des résultats faux ou des erreurs silencieuses.

La règle d’or : les fonctions comme DATESYTD, DATEADD ou SAMEPERIODLASTYEAR doivent être utilisées comme argument de filtre dans CALCULATE. Elles ne doivent jamais être appelées directement à l’intérieur d’un itérateur comme SUMX.

  • Mauvais pattern : appeler DATESYTD à l’intérieur d’une boucle ligne par ligne, ce qui provoque des transitions de contexte répétées et inutiles.

  • Bon pattern : stocker l’ensemble de dates dans une variable, puis l’injecter dans CALCULATE.

    VAR DatesYTD = DATESYTD(‘Date’[Date]) RETURN CALCULATE(SUM(Ventes[Montant]), DatesYTD)

Conseil de pro : Écrivez toujours vos mesures de time intelligence avec une variable nommée pour l’ensemble de dates. Cela rend le code plus lisible et évite de réévaluer la fonction plusieurs fois dans la même mesure.

Variable de date réutilisée dans une mesure DAX

DATEDIFF en détail : syntaxe, exemples chiffrés et alternatives

DATEDIFF accepte deux dates et une unité parmi SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER et YEAR, et retourne un entier représentant le nombre de frontières d’intervalle franchies entre les deux dates, pas une durée arrondie au sens intuitif.

C’est ce point qui piège le plus de développeurs : DATEDIFF compte les changements de calendrier, pas les jours écoulés. Un exemple concret le montre bien.

  1. 31 janvier au 1er février, unité MONTH. Un seul jour d’écart calendaire, mais le résultat vaut 1, parce qu’une frontière de mois a été franchie.

  2. 1er janvier au 31 décembre de la même année, unité YEAR. Presque 365 jours d’écart, mais le résultat vaut 0, puisqu’aucune frontière d’année n’est franchie.

  3. Lundi à dimanche de la même semaine, unité WEEK. Le résultat dépend du jour de début de semaine défini par le moteur, ce qui peut surprendre sur des données hebdomadaires.

À retenir : DATEDIFF compte des frontières, pas des durées écoulées. Deux dates séparées d’un jour peuvent afficher un écart de 1 mois, un an ou plus si elles chevauchent une frontière calendaire.

Quand vous avez besoin d’une durée exacte en jours plutôt que d’un comptage de frontières, une simple soustraction convertie en entier (INT(DateFin - DateDebut)) donne le nombre réel de jours écoulés. Pour une fraction d’année précise (utile en finance ou en calcul d’intérêts), YEARFRAC reste plus adapté que DATEDIFF avec l’unité YEAR. Réservez DATEDIFF aux cas où compter les frontières calendaires, et non les jours bruts, correspond réellement à votre besoin métier.

Déplacer et sélectionner des fenêtres temporelles

Trois fonctions dominent ce terrain : DATEADD, DATESINPERIOD et DATESBETWEEN. Chacune répond à un besoin différent.

Construire et marquer une table de dates fiable

Aucune fonction de time intelligence ne fonctionne correctement sans une table de dates propre, marquée comme telle dans le modèle. C’est la fondation qu’on oublie trop souvent.

  1. Générez la table avec CALENDAR(DateDébut, DateFin) ou CALENDARAUTO(), puis enrichissez-la avec ADDCOLUMNS pour ajouter Année, Mois, Trimestre et jour de semaine.

  2. Vérifiez la continuité : une table avec des trous fausse les cumuls YTD et les comparaisons d’une année sur l’autre. La time intelligence basée sur un calendrier personnalisé corrige certains de ces cas, notamment pour les calendriers non contigus.

  3. Marquez la table comme « table de dates » dans les propriétés du modèle. Sans ce marquage, certaines fonctions de time intelligence refusent de fonctionner ou produisent des résultats incohérents.

  4. Documentez les jours fériés et le calendrier fiscal si votre organisation ne suit pas l’année civile standard.

Pièges fréquents et conseils de performance

L’erreur la plus coûteuse en production reste l’appel direct d’une fonction de time intelligence dans un itérateur. DAX Patterns recommande explicitly d’éviter ce pattern au profit d’une variable calculée en amont, injectée ensuite dans CALCULATE.

Pour des rapports hebdomadaires ou des calendriers non continus, la time intelligence basée sur un calendrier personnalisé offre plus de souplesse que les fonctions standard, qui supposent une continuité stricte du calendrier.

Sur les projets où le calendrier fiscal ne suit pas l’année civile, ou où certaines semaines manquent dans la table de dates, les fonctions Time Intelligence classiques donnent des résultats faux sans lever la moindre erreur. Le seul filet de sécurité, c’est de tester chaque mesure avec des dates limites : premier jour de l’exercice, dernier jour, changements d’année.

Conseil de pro : Constituez un petit jeu de dates de test (premier jour de l’exercice, 31 décembre, 29 février d’une année bissextile) et validez chaque nouvelle mesure temporelle contre ce jeu avant de la publier. Une formation ciblée aux mesures DAX permet souvent d’industrialiser ces réflexes plus vite qu’un apprentissage isolé.

Recettes et snippets pratiques à copier-coller

Ces mesures couvrent les besoins les plus courants. Adaptez simplement les noms de colonnes à votre modèle.

BesoinMesure DAX (simplifiée)
Écart en heuresDATEDIFF([DebutTicket], [FinTicket], HOUR)
Jours ouvrés hors fériésNETWORKDAYS([Debut], [Fin], Feries[Date])
Ventes cumulées depuis janvierCALCULATE(SUM(Ventes[Montant]), DATESYTD('Date'[Date]))
Ventes année précédenteCALCULATE(SUM(Ventes[Montant]), DATEADD('Date'[Date], -1, YEAR))
Rolling 12 moisCALCULATE(SUM(Ventes[Montant]), DATESINPERIOD('Date'[Date], MAX('Date'[Date]), -12, MONTH))

Le snippet NETWORKDAYS suppose une table Feries contenant une colonne de dates fériées. Les snippets YTD, PY et rolling 12M partent tous du principe que la table Date est marquée comme table de dates et reliée sans ambiguïté à votre table de faits. Sans ce lien, les patterns de time intelligence standard produisent des totaux vides plutôt qu’une erreur explicite, ce qui rend le bug plus difficile à repérer.

Perspective : industrialiser les calculs temporels

La différence entre une mesure qui marche en démo et une mesure fiable en production tient à trois habitudes : tester avec des dates limites, documenter les hypothèses de calendrier (semaine, exercice fiscal), et automatiser la génération de la table de dates plutôt que la maintenir à la main. Monter les équipes sur une formation structurée, type PL-300, change durablement la qualité des déploiements.

— François

Formation et accompagnement Biworks pour aller plus vite

Écrire une mesure DATEDIFF ou une fenêtre DATESINPERIOD correcte est une chose. La déployer sur un modèle de production, avec une table de dates fiable et des calculs qui résistent aux changements d’exercice fiscal, en est une autre. C’est là que l’accompagnement fait la différence entre une mesure qui fonctionne en démo et une mesure qui tient dans le temps.

Biworks

Biworks propose une formation Power BI et DAX en trois jours, éligible au CPF, ainsi qu’une formation Power BI intermédiaire, pour les équipes qui veulent industrialiser leurs mesures temporelles plutôt que les rafistoler projet après projet. Pour les structures qui préfèrent déléguer l’audit et la modélisation, l’offre conseil et audit Power BI couvre la vérification des tables de dates, des calendriers fiscaux et des mesures existantes. Envie d’un diagnostic rapide de vos rapports actuels ? La prestation audit Power BI à 750 € est le point de départ le plus direct.

Sources

Pour approfondir chaque fonction citée, ces ressources restent les plus fiables.

Questions fréquentes

Quelle est la formule de calcul du temps en DAX ?

Il n’existe pas une seule formule : DATEDIFF(date1, date2, unité) mesure un écart entre deux dates en comptant les frontières franchies, tandis que les fonctions de time intelligence comme DATESYTD ou DATEADD construisent des fenêtres de dates à utiliser dans CALCULATE. Le choix dépend du besoin, mesurer une durée ou comparer des périodes.

Quelles sont les principales fonctions DAX pour le temps ?

Les plus utilisées sont DATEDIFF, EDATE, EOMONTH, YEARFRAC pour les calculs scalaires, et DATESYTD, DATEADD, DATESINPERIOD, TOTALYTD pour la time intelligence. La documentation Microsoft Learn recense l’ensemble de ces fonctions avec leurs paramètres exacts.

Qu’est-ce qu’une mesure DAX ?

Une mesure DAX est un calcul dynamique défini dans un modèle Power BI, qui se recalcule automatiquement selon le contexte de filtre appliqué (une année, un client, un produit). Contrairement à une colonne calculée, elle n’occupe aucun espace de stockage supplémentaire.

Comment utiliser la fonction DIVIDE() en DAX ?

DIVIDE(numérateur, dénominateur, valeur_alternative) effectue une division sécurisée qui retourne une valeur de remplacement (souvent 0 ou vide) au lieu d’une erreur quand le dénominateur vaut zéro. Elle est recommandée à la place de l’opérateur / classique dans toute mesure exposée à un dénominateur potentiellement nul, y compris dans des calculs de ratios temporels comme un taux de croissance d’une période sur l’autre.

Combien coûte une formation Power BI et DAX chez Biworks ?

BIWORKS propose une formation Power BI en trois jours éligible au CPF, ainsi qu’une formation Power BI intermédiaire pour approfondir DAX et Power Query. Un audit Power BI ciblé est disponible à 750 € pour un premier diagnostic des mesures existantes.

Recommandations

Questions fréquentes

Quelle est la formule de calcul du temps en DAX ?
Il n'existe pas une seule formule : DATEDIFF(date1, date2, unité) mesure un écart entre deux dates en comptant les frontières franchies, tandis que les fonctions de time intelligence comme DATESYTD ou DATEADD construisent des fenêtres de dates à utiliser dans CALCULATE. Le choix dépend du besoin, mesurer une durée ou comparer des périodes.
Quelles sont les principales fonctions DAX pour le temps ?
Les plus utilisées sont DATEDIFF, EDATE, EOMONTH, YEARFRAC pour les calculs scalaires, et DATESYTD, DATEADD, DATESINPERIOD, TOTALYTD pour la time intelligence. La documentation Microsoft Learn recense l'ensemble de ces fonctions avec leurs paramètres exacts.
Qu'est-ce qu'une mesure DAX ?
Une mesure DAX est un calcul dynamique défini dans un modèle Power BI, qui se recalcule automatiquement selon le contexte de filtre appliqué (une année, un client, un produit). Contrairement à une colonne calculée, elle n'occupe aucun espace de stockage supplémentaire.
Comment utiliser la fonction DIVIDE() en DAX ?
DIVIDE(numérateur, dénominateur, valeur_alternative) effectue une division sécurisée qui retourne une valeur de remplacement (souvent 0 ou vide) au lieu d'une erreur quand le dénominateur vaut zéro. Elle est recommandée à la place de l'opérateur / classique dans toute mesure exposée à un dénominateur potentiellement nul, y compris dans des calculs de ratios temporels comme un taux de croissance d'une période sur l'autre.
Combien coûte une formation Power BI et DAX chez Biworks ?
BIWORKS propose une formation Power BI en trois jours éligible au CPF, ainsi qu’une formation Power BI intermédiaire pour approfondir DAX et Power Query. Un audit Power BI ciblé est disponible à 750 € pour un premier diagnostic des mesures existantes.

À lire aussi

Intégrer l’IA et l’automatisation dans vos processus

Copilot, agents, Power Automate, flux de données : nous identifions les cas d’usage rentables et les mettons en production.

Explorer mes cas d’usage