Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När du arbetar med Power Query i verktyg som Excel och Power BI är det viktigt att hantera datum- och tidsvärden korrekt, särskilt när dina datatransformeringar är beroende av den aktuella tiden. Power Query erbjuder olika funktioner för att hämta aktuellt datum och tid:
- DateTime.LocalNow
- DateTimeZone.LocalNow
- DateTime.FixedLocalNow
- DateTimeZone.FixedLocalNow
- DateTimeZone.UtcNow
- DateTimeZone.FixedUtcNow.
Den här artikeln utforskar skillnaderna mellan dessa funktioner och klargör när och varför du ska använda var och en. Dessutom markeras en kritisk men ofta förbisedd detalj. Power Query Online returnerar alltid UTC-tid även när du använder en funktion som är märkt som "Lokal". Att förstå dessa nyanser kan hjälpa dig att undvika oväntade resultat, särskilt när du skapar tidskänsliga rapporter eller automatiserar datauppdateringar i appar som Power BI-tjänsten eller Power Apps.
Skillnader mellan funktioner
Var och en av de aktuella tidsfunktionerna har viktiga skillnader. Dessa funktioner varierar när det gäller tidszonsmedvetenhet, volatilitet (om värdet ändras när det anropas flera gånger i samma fråga) och hur de beter sig i olika miljöer (skrivbord jämfört med online). Följande tabell innehåller en uppdelning av varje funktion.
| Funktion | Retur | Flyktighet | Skrivbordsbeteende | Onlinebeteende | Typiskt användningsfall |
|---|---|---|---|---|---|
DateTime.LocalNow |
En datetime som representerar den aktuella lokala tiden |
Dynamisk – returnerar ett nytt värde varje gång det anropas under frågeutvärderingen | Returnerar lokal maskintid | Returnerar UTC-tid | Snabb lokal tidsstämpel utan tidszonskontext |
DateTimeZone.LocalNow |
Ett datetimezone värde som representerar den aktuella lokala tiden med tidszonsförskjutning |
Dynamisk – returnerar ett nytt värde varje gång det anropas under frågeutvärderingen | Returnerar lokal tid med förskjutning | Returnerar UTC-tid med +00:00 förskjutning |
Lokal tid med tidszonsmedvetenhet |
DateTime.FixedLocalNow |
Ett datetime värde som representerar den lokala tiden när det först anropades under frågeutvärderingen |
Fast – returnerar samma värde i en enskild frågeutvärdering | Fångar upp lokal tid när den först anropas | Samlar in UTC-tid när den först anropas | Ögonblicksbild av lokal tid utan tidszon |
DateTimeZone.FixedLocalNow |
Ett datetimezone värde som representerar den lokala tiden med förskjutning när det först anropades under frågeutvärderingen |
Fast – returnerar samma värde i en enskild frågeutvärdering | Samlar in den lokala tiden med tidsförskjutning vid första anropet | Registrerar UTC-tid med +00:00 förskjutning när den först anropas |
Ögonblicksbild av lokal tid med tidszon |
DateTimeZone.UtcNow |
Ett datetimezone värde som representerar den aktuella UTC-tiden |
Dynamisk – returnerar ett nytt värde varje gång det anropas under frågeutvärderingen | Returnerar aktuell UTC-tid | Returnerar aktuell UTC-tid | Konsekvent UTC-tidsstämpel för dynamiska scenarier |
DateTimeZone.FixedUtcNow |
Ett datetimezone värde som representerar UTC-tiden när det först anropades under frågeutvärderingen |
Fast – returnerar samma värde i en enskild frågeutvärdering | Samlar in UTC-tid när den först anropas | Samlar in UTC-tid när den först anropas | UTC-tidsstämpel har fastställts för loggning eller granskning |
I Power Query M är valet mellan lokala tids- och UTC-baserade datum- och tidsfunktioner ett viktigt designbeslut som påverkar konsekvensen, noggrannheten och portabiliteten för dina frågor. Funktioner som DateTime.LocalNow och DateTime.FixedLocalNow är användbara när logiken är beroende av den lokala systemtiden, till exempel filtrering för poster som inträffat "idag" eller generera tidsstämplar för användarriktade rapporter. Dessa funktioner återspeglar tidszonen för miljön där frågan körs, vilket gör dem lämpliga för Power Query Desktop-scenarier där den lokala kontexten är väldefinierad.
Men i distribuerade eller molnbaserade miljöer som Power Query Online returnerar samma funktioner UTC-tid, inte användarens faktiska lokala tid. Den här avvikelsen kan leda till subtila inkonsekvenser om logiken förutsätter en lokal tidskontext. Däremot tillhandahåller DateTimeZone.UtcNow och DateTimeZone.FixedUtcNow en tidszonsneutral referenspunkt som är konsekvent mellan miljöer och som inte påverkas av sommartid eller regionala inställningar. Dessa UTC-baserade funktioner är det bästa valet för scenarier som rör dataintegrering, loggning, granskning eller logik som måste bete sig identiskt oavsett var eller när frågan körs.
Skillnader mellan funktionerna LocalNow och FixedLocalNow
Power Query M innehåller fyra funktioner för att hämta den aktuella lokala tiden:
-
DateTime.LocalNowreturnerar den aktuella lokaldatetimevarje gång uttrycket utvärderas. -
DateTime.FixedLocalNowreturnerar den lokaladatetimeutvärderingen en gång per fråga och fungerar som en ögonblicksbild. -
DateTimeZone.LocalNowreturnerar den aktuella lokaldatetimezonevarje gång uttrycket utvärderas. -
DateTimeZone.FixedLocalNowreturnerar den lokaladatetimezoneutvärderingen en gång per fråga och fungerar som en ögonblicksbild
För att visa skillnaden genererar följande exempel en tabell med flera rader. Varje rad samlar in ett nytt DateTime.LocalNow värde med hjälp av en fördröjning för att säkerställa distinkta tidsstämplar, medan varje insamlat DateTime.FixedLocalNow värde förblir konstant över alla rader.
Anmärkning
Alla datum och tider i utdata från exemplen i den här artikeln beror på när funktionerna körs. Datum och tider som visas i utdata är endast i demonstrationssyfte.
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
Utdata från det här exemplet är:
Om du tittar på utdata kanske du märker att även om DateTime.LocalNow funktionen visas först i koden, visar värdet som returneras för DateTime.FixedLocalNow en tid som inträffar före DateTime.LocalTime tiden. Även om DateTime.LocalNow visas först i tabellkonstruktionen är utvärderingsordningen i Power Query M inte garanterad att följa ordningen på fälten i en tabell. I stället använder Power Query en lat utvärderingsmodell. Att använda den här modellen innebär att fält endast utvärderas när det behövs och att motorn avgör utvärderingsordningen, inte ordningen i koden. I det här fallet utvärderas funktionen DateTime.FixedLocalNow först, så den första tiden som returneras för den här funktionen inträffar innan den första tiden som returneras för DateTime.LocalNow.
I följande exempel visas hur du skapar liknande resultat med hjälp av DateTimeZone.LocalNow och 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
Utdata från det här exemplet i Power Query Desktop är:
Anmärkning
Om du kör det här exemplet i Power Query Online är tiden som returneras alltid UTC-tid och tidszonsdelen av de returnerade värdena är alltid +00:00.
Skillnader mellan funktionerna UtcNow och FixedUtcNow
Power Query M innehåller två funktioner för att hämta den aktuella UTC-tiden:
-
DateTimeZone.UtcNowreturnerar aktuell UTCdatetimezonevarje gång uttrycket utvärderas. -
DateTimeZone.FixedUtcNowreturnerar den lokaladatetimezoneutvärderingen en gång per fråga och fungerar som en ögonblicksbild.
Skillnaderna mellan dessa två funktioner liknar LocalNow funktionerna och FixedLocalNow . Men oavsett om funktionerna körs i Power Query Desktop eller Power Query Online returneras returvärdena alltid som UTC-tid. I följande exempel visas skillnaderna mellan dessa två funktioner.
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
Utdata från det här exemplet i både Power Query Desktop och Power Query Online är:
Effekter på andra funktioner
Andra Power Query M-funktioner som är beroende av aktuellt datum och tid kan också påverkas av hur den lokala tiden returneras på antingen Power Query Desktop eller Power Query Online. Om du till exempel använder DateTimeZone.ToLocal funktionen för att konvertera UTC-tid till lokal tid returnerar den fortfarande UTC-tiden i Power Query Online.
Ett annat exempel är alla funktioner som kan använda den aktuella systemtiden som en parameter. Dessa funktioner omfattar Date.Month, Date.DayOfYear, DateTime.IsInCurrentYear eller DateTimeZone.ZoneHoursnågon annan funktion som kan utvärdera aktuellt datum och tid.
Om logiken i alla dessa funktioner är beroende av om ett värde ligger inom den aktuella dagen, timmen, månaden eller året kan resultaten skilja sig åt mellan miljöer. Dessa skillnader mellan miljöer är särskilt märkbara om frågan körs nära en gräns (till exempel strax före eller efter midnatt, början av en ny månad eller ett nytt år). Om konsekvens är avgörande i olika miljöer använder du DateTimeZone.UtcNow funktionerna eller DateTimeZone.FixedUtcNow för att hämta datum och tid.
Bästa praxis och rekommendationer
Om du väljer rätt tidsfunktion i Power Query beror på ditt specifika användningsfall, i vilken miljö frågan körs (skrivbord jämfört med online) och om du behöver en dynamisk eller fast tidsstämpel. Här följer några metodtips som hjälper dig att vägleda ditt beslut:
-
Var tydlig med tidszoner: Använd Funktionerna DateTimeZone i stället för DateTime-funktioner när tidszonskontexten är viktig. Använd
DateTimeZone.UtcNowellerDateTimeZone.FixedUtcNowför konsekvens mellan miljöer, särskilt i molnbaserade lösningar som Power BI-tjänsten. -
Använd fasta funktioner för repeterbara resultat: Använd de fasta varianterna (till exempel
DateTimeZone.FixedUtcNow) när du vill att tidsstämpeln ska förbli konstant mellan frågeutvärderingar. Den här metoden är särskilt användbar för loggning, granskning eller insamling av tiden för datainmatning. -
Undvik lokala funktioner i Power Query Online: Funktioner som
DateTime.LocalNowochDateTimeZone.LocalNowreturnerar UTC-tid i molnbaserade lösningar som Power BI-tjänsten, vilket kan leda till förvirring eller felaktiga antaganden. Om du behöver faktisk lokal tid i tjänsten kan du överväga att justera UTC manuellt med hjälp av kända förskjutningar (även om den här justeringen kan vara skör, till exempel på grund av sommartid eller regionala inställningar). - Testa i både skrivbords- och onlinemiljöer: Testa alltid dina frågor i både Power Query Desktop och Power Query Online om logiken är beroende av aktuell tid. Den här testningen hjälper till att fånga avvikelser tidigt, särskilt för schemalagda uppdateringsscenarier.
- Dokumentera tidslogik: Kommentera eller dokumentera tydligt varför en viss tidsfunktion används, särskilt om du använder en lösning för tidszonshantering. Den här informationen hjälper framtida medarbetare att förstå avsikten bakom logiken.
- Använd UTC för schemalagda arbetsflöden: För schemalagda uppdateringar eller automatiserade pipelines är UTC det säkraste och mest förutsägbara valet. Det undviker tvetydighet som orsakas av sommartid eller regionala tidszonsskift.
- Cachetidsvärden vid behov: Om du behöver använda samma tidsstämpel i flera steg i en fråga tilldelar du den till en variabel överst i frågan med hjälp av en fast funktion. Den här variabeln säkerställer konsekvens i hela omvandlingslogik.