Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Lorsque vous travaillez avec Power Query dans des outils tels qu’Excel et Power BI, la gestion des valeurs de date et d’heure est essentielle, en particulier lorsque vos transformations de données dépendent de l’heure actuelle. Power Query offre différentes fonctions pour récupérer la date et l’heure actuelles :
- DateTime.LocalNow
- DateTimeZone.LocalNow
- DateTime.FixedLocalNow
- DateTimeZone.FixedLocalNow
- DateTimeZone.UtcNow
- DateTimeZone.FixedUtcNow.
Cet article explore les distinctions entre ces fonctions et précise quand et pourquoi utiliser chacun d’eux. En outre, il met en évidence un détail critique mais souvent négligé. Power Query Online retourne toujours l’heure UTC même lorsque vous utilisez une fonction intitulée « Local ». Comprendre ces nuances peut vous aider à éviter des résultats inattendus, en particulier lors de la création de rapports sensibles au temps ou de l’automatisation des mises à jour des données dans des applications telles que le service Power BI ou Power Apps.
Différences entre les fonctions
Chacune des fonctions temporelles actuelles présente des différences importantes. Ces fonctions varient en termes de prise en charge des fuseaux horaires, de volatilité (si la valeur change lorsqu’elle est appelée plusieurs fois dans la même requête) et de la façon dont elles se comportent dans différents environnements (bureau et en ligne). Le tableau suivant contient une répartition de chaque fonction.
| Fonction | Retours | Volatilité | Comportement du bureau | Comportement en ligne | Cas d’utilisation classique |
|---|---|---|---|---|---|
DateTime.LocalNow |
Une datetime représentant l’heure locale actuelle |
Dynamique : retourne une nouvelle valeur chaque fois qu’elle est appelée pendant l’évaluation de la requête | Retourne l’heure de l’ordinateur local | Retourne l’heure UTC | Horodatage local rapide sans contexte de fuseau horaire |
DateTimeZone.LocalNow |
Valeur datetimezone représentant l’heure locale actuelle avec décalage de fuseau horaire |
Dynamique : retourne une nouvelle valeur chaque fois qu’elle est appelée pendant l’évaluation de la requête | Retourne l'heure locale avec décalage horaire | Retourne l’heure UTC avec le décalage de +00:00 |
Heure locale avec prise en charge du fuseau horaire |
DateTime.FixedLocalNow |
Valeur datetime représentant l’heure locale lors du premier appel pendant l’évaluation de la requête |
Fixe—retourne la même valeur tout au long d’une évaluation de requête unique | Capture l’heure locale lors du premier appel | Capture l'heure UTC lors du premier appel | Instantané de l’heure locale sans fuseau horaire |
DateTimeZone.FixedLocalNow |
Valeur datetimezone représentant l'heure locale avec décalage lors du premier appel pendant l'évaluation de la requête. |
Fixe—retourne la même valeur tout au long d’une évaluation de requête unique | Capture l’heure locale avec décalage lors du premier appel | Captures le temps UTC avec un décalage de +00:00 lors du premier appel. |
Instantané de l’heure locale avec fuseau horaire |
DateTimeZone.UtcNow |
Valeur datetimezone représentant l’heure UTC actuelle |
Dynamique : retourne une nouvelle valeur chaque fois qu’elle est appelée pendant l’évaluation de la requête | Retourne l’heure UTC actuelle | Retourne l’heure UTC actuelle | Horodatage UTC cohérent pour les scénarios dynamiques |
DateTimeZone.FixedUtcNow |
Valeur datetimezone représentant l’heure UTC lors du premier appel dans le cadre de l’évaluation de la requête |
Fixe—retourne la même valeur tout au long d’une évaluation de requête unique | Capture l'heure UTC lors du premier appel | Capture l'heure UTC lors du premier appel | Horodatage UTC corrigé pour la journalisation ou l’audit |
Dans Power Query M, le choix entre l’heure locale et les fonctions de date et d’heure UTC est une décision de conception critique qui affecte la cohérence, la précision et la portabilité de vos requêtes. Les fonctions comme DateTime.LocalNow et DateTime.FixedLocalNow sont utiles lorsque votre logique dépend de l’heure système locale, comme le filtrage des enregistrements qui se sont produits « aujourd’hui » ou la génération d’horodatages pour les rapports accessibles par l’utilisateur. Ces fonctions reflètent le fuseau horaire de l’environnement dans lequel la requête est exécutée, ce qui les rend adaptées aux scénarios Power Query Desktop où le contexte local est bien défini.
Toutefois, dans des environnements distribués ou cloud comme Power Query Online, ces mêmes fonctions retournent l’heure UTC, et non l’heure locale réelle de l’utilisateur. Cette différence peut entraîner des incohérences subtiles si votre logique suppose un contexte de temps local. En revanche, DateTimeZone.UtcNow et DateTimeZone.FixedUtcNow fournissent un point de référence neutre de fuseau horaire qui est cohérent entre les environnements et non affecté par les paramètres régionaux et d’heure d’été. Ces fonctions UTC sont le choix préféré pour les scénarios impliquant l’intégration de données, la journalisation, l’audit ou toute logique qui doit se comporter de façon identique, quel que soit l’emplacement ou l’exécution de la requête.
Différences entre les fonctions LocalNow et FixedLocalNow
Power Query M fournit quatre fonctions pour récupérer l’heure locale actuelle :
-
DateTime.LocalNowretourne le localdatetimeactuel chaque fois que l’expression est évaluée. -
DateTime.FixedLocalNowrenvoie la valeur localedatetimeune fois par évaluation de requête, comme un instantané. -
DateTimeZone.LocalNowretourne le localdatetimezoneactuel chaque fois que l’expression est évaluée. -
DateTimeZone.FixedLocalNowretourne la valeurdatetimezonelocale une fois par évaluation de requête, agissant en tant qu’image instantanée
Pour illustrer la différence, l’exemple suivant génère une table avec plusieurs lignes. Chaque ligne capture une DateTime.LocalNow nouvelle valeur à l’aide d’un délai pour garantir des horodatages distincts, tandis que chaque valeur capturée DateTime.FixedLocalNow reste constante sur toutes les lignes.
Remarque
Toutes les dates et heures de la sortie des exemples de cet article dépendent de l’exécution des fonctions. Les dates et heures affichées dans la sortie sont uniquement à des fins de démonstration.
let
// Create a table with LocalNow and FixedLocalNow columns
TableWithTimes = Table.FromList(
{1..5},
each {
_,
Function.InvokeAfter(() => DateTime.LocalNow(), #duration(0, 0, 0, 0.2)),
Function.InvokeAfter(() => DateTime.FixedLocalNow(), #duration(0, 0, 0, 0.2))
},
{"Index", "LocalNow", "FixedLocalNow"}
),
// Format both datetime columns
FormatLocalNow = Table.TransformColumns(TableWithTimes,
{{"LocalNow", each DateTime.ToText(_, "yyyy-MM-ddThh:mm:ss.fff")}}),
FormatFixedNow = Table.TransformColumns(FormatLocalNow,
{{"FixedLocalNow", each DateTime.ToText(_, "yyyy-MM-ddThh:mm:ss.fff")}}),
// Change the table types
FinalTable = Table.TransformColumnTypes(FormatFixedNow, {{"Index", Int64.Type},
{"LocalNow", type text}, {"FixedLocalNow", type text}})
in
FinalTable
La sortie de cet exemple est :
Si vous examinez la sortie, vous remarquerez peut-être que même si DateTime.LocalNow la fonction apparaît en premier dans le code, la valeur retournée pour DateTime.FixedLocalNow affiche une heure qui se produit avant l'heure de DateTime.LocalTime. Même si DateTime.LocalNow est répertorié en premier dans la construction de la table, l'ordre d'évaluation dans Power Query M n'est pas garanti de suivre l'ordre des champs d'une table. Au lieu de cela, Power Query utilise un modèle d’évaluation différé. L’utilisation de ce modèle signifie que les champs sont évalués uniquement si nécessaire et que le moteur détermine l’ordre d’évaluation, et non l’ordre dans votre code. Dans ce cas, la DateTime.FixedLocalNow fonction est évaluée en premier, de sorte que la première fois retournée pour cette fonction se produit avant la première fois retournée pour DateTime.LocalNow.
L’exemple suivant montre comment produire des résultats similaires à l’aide DateTimeZone.LocalNow et DateTimeZone.FixedLocalNow.
let
// Create a table with LocalNow and FixedLocalNow columns
TableWithTimes = Table.FromList(
{1..5},
each {
_,
Function.InvokeAfter(() => DateTimeZone.LocalNow(), #duration(0, 0, 0, 0.2)),
Function.InvokeAfter(() => DateTimeZone.FixedLocalNow(), #duration(0, 0, 0, 0.2))
},
{"Index", "LocalNow", "FixedLocalNow"}
),
// Format both datetimezone columns
FormatLocalNow = Table.TransformColumns(TableWithTimes,
{{"LocalNow", each DateTimeZone.ToText(_, "yyyy-MM-ddThh:mm:ss.fff:zzz")}}),
FormatFixedNow = Table.TransformColumns(FormatLocalNow,
{{"FixedLocalNow", each DateTimeZone.ToText(_, "yyyy-MM-ddThh:mm:ss.fff:zzz")}}),
// Change the table types
FinalTable = Table.TransformColumnTypes(FormatFixedNow,
{{"Index", Int64.Type}, {"LocalNow", type text}, {"FixedLocalNow", type text}})
in
FinalTable
La sortie de cet exemple dans Power Query Desktop est la suivante :
Remarque
Si vous exécutez cet exemple dans Power Query Online, l’heure retournée est toujours l’heure UTC et la partie fuseau horaire des valeurs retournées est toujours +00:00.
Différences entre les fonctions UtcNow et FixedUtcNow
Power Query M fournit deux fonctions pour récupérer l’heure UTC actuelle :
-
DateTimeZone.UtcNowretourne l’utcdatetimezoneactuel chaque fois que l’expression est évaluée. -
DateTimeZone.FixedUtcNowrenvoie la valeur localedatetimezoneune fois par évaluation de requête, comme un instantané.
Les différences entre ces deux fonctions sont similaires aux fonctions LocalNow et FixedLocalNow. Toutefois, si les fonctions sont exécutées dans Power Query Desktop ou Power Query Online, les valeurs de retour sont toujours retournées en tant qu’heure UTC. L’exemple suivant illustre les différences entre ces deux fonctions.
let
// Create a table with UtcNow and FixedUtcNow columns
TableWithTimes = Table.FromList(
{1..5},
each {
_,
Function.InvokeAfter(() => DateTimeZone.UtcNow(), #duration(0, 0, 0, 0.2)),
Function.InvokeAfter(() => DateTimeZone.FixedUtcNow(), #duration(0, 0, 0, 0.2))
},
{"Index", "UtcNow", "FixedUtcNow"}
),
// Format both datetimezone columns
FormatLocalNow = Table.TransformColumns(TableWithTimes,
{{"UtcNow", each DateTimeZone.ToText(_, "yyyy-MM-ddThh:mm:ss.fff:zzz")}}),
FormatFixedNow = Table.TransformColumns(FormatLocalNow,
{{"FixedUtcNow", each DateTimeZone.ToText(_, "yyyy-MM-ddThh:mm:ss.fff:zzz")}}),
// Change the table types
FinalTable = Table.TransformColumnTypes(FormatFixedNow,
{{"Index", Int64.Type}, {"UtcNow", type text}, {"FixedUtcNow", type text}})
in
FinalTable
La sortie de cet exemple dans Power Query Desktop et Power Query Online est la suivante :
Effets sur d’autres fonctions
D’autres fonctions Power Query M qui dépendent de la date et de l’heure actuelles peuvent également être affectées par la façon dont l’heure locale est retournée sur Power Query Desktop ou Power Query Online. Par exemple, si vous utilisez la fonction pour convertir l’heure DateTimeZone.ToLocal UTC en heure locale, elle retourne toujours l’heure UTC sur Power Query Online.
Un autre exemple est n’importe quelle fonction qui peut utiliser l’heure système actuelle en tant que paramètre. Ces fonctions incluent Date.Month, , Date.DayOfYearDateTime.IsInCurrentYear, DateTimeZone.ZoneHoursou toute autre fonction qui peut évaluer la date et l’heure actuelles.
Dans toutes ces fonctions, si votre logique dépend si une valeur se situe dans le jour, l’heure, le mois ou l’année en cours, les résultats peuvent différer entre les environnements. Ces différences entre les environnements sont particulièrement notables si la requête s’exécute près d’une limite (par exemple, juste avant ou après minuit, début d’un nouveau mois ou nouvelle année). Si la cohérence est cruciale dans différents environnements, utilisez les fonctions DateTimeZone.UtcNow ou DateTimeZone.FixedUtcNow pour récupérer la date et l’heure.
Meilleures pratiques et recommandations
Le choix de la fonction de temps appropriée dans Power Query dépend de votre cas d’usage spécifique, de l’environnement dans lequel votre requête s’exécute (bureau ou en ligne) et de la nécessité d’un horodatage dynamique ou fixe. Voici quelques bonnes pratiques pour vous aider à guider votre décision :
-
Soyez explicite sur les fuseaux horaires : utilisez les fonctions DateTimeZone au lieu des fonctions DateTime lorsque le contexte du fuseau horaire importe. Utilisez
DateTimeZone.UtcNowouDateTimeZone.FixedUtcNowpour assurer la cohérence entre les environnements, en particulier dans les solutions cloud telles que le service Power BI. -
Utilisez des fonctions fixes pour les résultats reproductibles : utilisez les variantes fixes (par exemple
DateTimeZone.FixedUtcNow) lorsque vous souhaitez que l’horodatage reste constant entre les évaluations des requêtes. Cette méthode est particulièrement utile pour la journalisation, l’audit ou la capture du temps d’ingestion des données. -
Évitez les fonctions locales dans Power Query Online : les fonctions comme
DateTime.LocalNowetDateTimeZone.LocalNowretournent l’heure UTC dans des solutions cloud telles que le service Power BI, ce qui peut entraîner des confusions ou des hypothèses incorrectes. Si vous avez besoin de l’heure locale réelle dans le service, envisagez d’ajuster l’heure UTC manuellement à l’aide de décalages connus (bien que cet ajustement puisse être fragile, par exemple, en raison de l’heure d’été ou des paramètres régionaux). - Test dans les environnements de bureau et en ligne : testez toujours vos requêtes dans Power Query Desktop et Power Query Online si votre logique dépend de l’heure actuelle. Ce test permet d’intercepter les écarts précoces, en particulier pour les scénarios d’actualisation planifiée.
- Documentez votre logique de temps : commentez ou documentez clairement pourquoi une fonction de temps spécifique est utilisée, en particulier si vous utilisez une solution de contournement pour la gestion des fuseaux horaires. Ces informations aident les collaborateurs futurs à comprendre l’intention derrière la logique.
- Utilisez UTC pour les flux de travail planifiés : pour les actualisations planifiées ou les pipelines automatisés, UTC est le choix le plus sûr et le plus prévisible. Il évite l’ambiguïté causée par le temps d’été ou les décalages de fuseau horaire régional.
- Valeurs de temps de cache si nécessaire : si vous devez utiliser le même horodatage sur plusieurs étapes d’une requête, affectez-la à une variable en haut de votre requête à l’aide d’une fonction fixe. Cette variable garantit la cohérence tout au long de la logique de transformation.