หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
เมื่อคุณทํางานกับ Power Query ในเครื่องมือ เช่น Excel และ Power BI การจัดการค่าวันที่และเวลาอย่างแม่นยําเป็นสิ่งสําคัญ โดยเฉพาะอย่างยิ่งเมื่อการแปลงข้อมูลของคุณจะขึ้นอยู่กับเวลาปัจจุบัน Power Query มีฟังก์ชันต่าง ๆ ในการดึงข้อมูลวันที่และเวลาปัจจุบัน:
- DateTime.LocalNow
- DateTimeZone.LocalNow
- DateTime.FixedLocalNow
- DateTimeZone.FixedLocalNow
- DateTimeZone.UtcNow
- DateTimeZone.FixedUtcNow.
บทความนี้จะสํารวจความแตกต่างระหว่างฟังก์ชันเหล่านี้และอธิบายช่วงเวลาและเหตุผลในการใช้แต่ละฟังก์ชัน นอกจากนี้ยังเน้นรายละเอียดที่สําคัญ แต่มักจะมองข้ามไป Power Query Online จะส่งกลับเวลา UTC เสมอแม้ว่าจะใช้ฟังก์ชันที่มีป้ายชื่อเป็น "ภายในเครื่อง" การทําความเข้าใจเกี่ยวกับความแตกต่างเหล่านี้สามารถช่วยให้คุณหลีกเลี่ยงผลลัพธ์ที่ไม่คาดคิดโดยเฉพาะอย่างยิ่งเมื่อสร้างรายงานที่มีความสําคัญกับเวลาหรือการอัปเดตข้อมูลอัตโนมัติในแอป เช่น บริการ Power BI หรือ Power Apps
ความแตกต่างระหว่างฟังก์ชัน
แต่ละฟังก์ชันเวลาปัจจุบันมีความแตกต่างกันที่สําคัญ ฟังก์ชันเหล่านี้จะแตกต่างกันไปตามเงื่อนไขของการรับรู้โซนเวลา ความผันผวน (ไม่ว่าค่าจะเปลี่ยนแปลงเมื่อเรียกใช้หลายครั้งในคิวรีเดียวกัน) และวิธีทํางานในสภาพแวดล้อมที่แตกต่างกัน (เดสก์ท็อปเทียบกับออนไลน์) ตารางต่อไปนี้ประกอบด้วยข้อมูลสรุปของแต่ละฟังก์ชัน
| Function | Returns | Volatility | ลักษณะการทํางานของเดสก์ท็อป | ลักษณะการทํางานออนไลน์ | กรณีการใช้งานทั่วไป |
|---|---|---|---|---|---|
DateTime.LocalNow |
datetimeที่แสดงเวลาท้องถิ่นปัจจุบัน |
Dynamic— ส่งกลับค่าใหม่ในแต่ละครั้งที่มีการเรียกใช้ในระหว่างการประเมินคิวรี | ส่งกลับเวลาเครื่องท้องถิ่น | แสดงเวลา UTC | ประทับเวลาท้องถิ่นด่วนโดยไม่มีบริบทโซนเวลา |
DateTimeZone.LocalNow |
datetimezoneค่าที่แสดงเวลาท้องถิ่นปัจจุบันพร้อมด้วยออฟเซตโซนเวลา |
Dynamic— ส่งกลับค่าใหม่ในแต่ละครั้งที่มีการเรียกใช้ในระหว่างการประเมินคิวรี | ส่งกลับเวลาท้องถิ่นที่มีออฟเซต | ส่งกลับเวลา UTC ที่มี +00:00 ออฟเซต |
เวลาท้องถิ่นที่มีการรับรู้โซนเวลา |
DateTime.FixedLocalNow |
datetimeค่าที่แสดงเวลาท้องถิ่นเมื่อมีการเรียกใช้ครั้งแรกในระหว่างการประเมินคิวรี |
คงที่—ส่งกลับค่าเดียวกันตลอดการประเมินคิวรีเดียว | จับเวลาท้องถิ่นเมื่อมีการเรียกใช้ครั้งแรก | จับเวลา UTC เมื่อเรียกครั้งแรก | สแนปช็อตของเวลาท้องถิ่นโดยไม่มีโซนเวลา |
DateTimeZone.FixedLocalNow |
datetimezoneค่าที่แสดงเวลาท้องถิ่นที่มีออฟเซตเมื่อมีการเรียกใช้ครั้งแรกในระหว่างการประเมินคิวรี |
คงที่—ส่งกลับค่าเดียวกันตลอดการประเมินคิวรีเดียว | จับเวลาท้องถิ่นด้วยค่าชดเชยเมื่อเรียกครั้งแรก | จับเวลา UTC ด้วย +00:00 ออฟเซตเมื่อเรียกครั้งแรก |
สแนปช็อตของเวลาท้องถิ่นที่มีโซนเวลา |
DateTimeZone.UtcNow |
datetimezoneค่าที่แสดงถึงเวลา UTC ปัจจุบัน |
Dynamic— ส่งกลับค่าใหม่ในแต่ละครั้งที่มีการเรียกใช้ในระหว่างการประเมินคิวรี | แสดงเวลา UTC ปัจจุบัน | แสดงเวลา UTC ปัจจุบัน | ประทับเวลา UTC ที่สอดคล้องกันสําหรับสถานการณ์แบบไดนามิก |
DateTimeZone.FixedUtcNow |
datetimezoneค่าที่แสดงเวลา UTC เมื่อมีการเรียกใช้ครั้งแรกในระหว่างการประเมินคิวรี |
คงที่—ส่งกลับค่าเดียวกันตลอดการประเมินคิวรีเดียว | จับเวลา UTC เมื่อเรียกครั้งแรก | จับเวลา UTC เมื่อเรียกครั้งแรก | แก้ไขประทับเวลา UTC สําหรับการบันทึกหรือการตรวจสอบ |
ใน Power Query M การเลือกระหว่างเวลาท้องถิ่นและฟังก์ชันวันที่และเวลาที่ใช้ UTC คือการตัดสินใจการออกแบบที่สําคัญที่ส่งผลกระทบต่อความสอดคล้อง ความถูกต้อง และความสะดวกในการคิวรีของคุณ ฟังก์ชันเช่น DateTime.LocalNow และ DateTime.FixedLocalNow จะมีประโยชน์เมื่อตรรกะของคุณขึ้นอยู่กับเวลาของระบบภายในเครื่อง เช่น การกรองระเบียนที่เกิดขึ้น "วันนี้" หรือสร้างการประทับเวลาสําหรับรายงานที่ผู้ใช้เชื่อมต่อ ฟังก์ชันเหล่านี้สะท้อนถึงโซนเวลาของสภาพแวดล้อมที่มีการดําเนินการคิวรี ซึ่งทําให้เหมาะสําหรับสถานการณ์ Power Query Desktop ที่มีการกําหนดบริบทภายในเครื่องไว้อย่างดี
อย่างไรก็ตาม ในสภาพแวดล้อมแบบกระจายหรือบนระบบคลาวด์ เช่น Power Query Online ฟังก์ชันเดียวกันนี้จะแสดงเวลา UTC ไม่ใช่เวลาท้องถิ่นที่แท้จริงของผู้ใช้ ความขัดแย้งนี้อาจนําไปสู่ความไม่สอดคล้องกันที่ละเอียดอ่อน หากตรรกะของคุณถือว่าเป็นบริบทเวลาท้องถิ่น ใน DateTimeZone.UtcNow ทางตรงกันข้าม และ DateTimeZone.FixedUtcNow ให้จุดอ้างอิง time-zone-neutral ที่สอดคล้องกับสภาพแวดล้อมต่าง ๆ และไม่ได้รับผลกระทบตามเวลาออมแสงหรือการตั้งค่าภูมิภาค ฟังก์ชันที่ใช้ UTC เหล่านี้เป็นตัวเลือกที่เหมาะสมสําหรับสถานการณ์ที่เกี่ยวข้องกับการรวมข้อมูล การบันทึก การตรวจสอบ หรือตรรกะใด ๆ ที่ต้องทํางานเหมือนกันโดยไม่คํานึงถึงตําแหน่งหรือเมื่อเรียกใช้คิวรี
ความแตกต่างระหว่างฟังก์ชัน LocalNow และ FixedLocalNow
Power Query M มีฟังก์ชันสี่ฟังก์ชันสําหรับการดึงข้อมูลเวลาท้องถิ่นปัจจุบัน:
-
DateTime.LocalNowแสดงท้องถิ่นdatetimeปัจจุบันทุกครั้งที่ประเมินนิพจน์ -
DateTime.FixedLocalNowส่งกลับค่าภายในdatetimeเครื่องหนึ่งครั้งต่อการประเมินคิวรี ซึ่งทําหน้าที่เป็นสแนปช็อต -
DateTimeZone.LocalNowแสดงท้องถิ่นdatetimezoneปัจจุบันทุกครั้งที่ประเมินนิพจน์ -
DateTimeZone.FixedLocalNowแสดงค่าภายในdatetimezoneเครื่องหนึ่งครั้งต่อการประเมินคิวรี ซึ่งทําหน้าที่เป็นสแนปช็อต
เพื่อแสดงให้เห็นถึงความแตกต่าง ตัวอย่างต่อไปนี้จะสร้างตารางที่มีหลายแถว แต่ละแถวมีค่าใหม่ DateTime.LocalNow โดยใช้การหน่วงเวลาเพื่อให้แน่ใจว่าการประทับเวลาที่แตกต่างกัน ในขณะที่ค่าที่ DateTime.FixedLocalNow จับภาพแต่ละรายการยังคงคงที่ในทุกแถว
Note
วันที่และเวลาทั้งหมดในผลลัพธ์ของตัวอย่างในบทความนี้จะขึ้นอยู่กับเมื่อมีการเรียกใช้ฟังก์ชัน วันที่และเวลาที่แสดงในผลลัพธ์มีไว้เพื่อวัตถุประสงค์ในการสาธิตเท่านั้น
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
ผลลัพธ์ของตัวอย่างนี้คือ:
หากคุณดูเอาต์พุต คุณอาจสังเกตเห็นว่าแม้ว่า DateTime.LocalNow ฟังก์ชันจะปรากฏเป็นอันดับแรกในโค้ด ค่าที่ส่งกลับจะแสดง DateTime.FixedLocalNow เวลาที่เกิดขึ้นก่อน DateTime.LocalTime เวลา แม้ว่าจะ DateTime.LocalNow แสดงรายการก่อนในรูปแบบตาราง แต่ลําดับการประเมินใน Power Query M ไม่รับประกันว่าจะไม่เป็นไปตามลําดับของเขตข้อมูลในตาราง แต่ Power Query จะใช้แบบจําลองการประเมินผลแบบขี้เกียจ การใช้แบบจําลองนี้หมายความว่าระบบจะประเมินเฉพาะเขตข้อมูลเมื่อจําเป็นและกลไกจัดการจะกําหนดลําดับการประเมิน ไม่ใช่ลําดับในโค้ดของคุณ ในกรณีนี้ DateTime.FixedLocalNow ฟังก์ชันจะถูกประเมินก่อน ดังนั้นการส่งกลับครั้งแรกสําหรับฟังก์ชันนี้จะเกิดขึ้นก่อนที่จะมีการส่งค่ากลับมาครั้งแรกสําหรับDateTime.LocalNow
ตัวอย่างต่อไปนี้แสดงวิธีการสร้างผลลัพธ์ที่คล้ายกันโดยใช้ DateTimeZone.LocalNow และ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
ผลลัพธ์ของตัวอย่างนี้ใน Power Query Desktop คือ:
Note
ถ้าคุณเรียกใช้ตัวอย่างนี้ใน Power Query Online เวลาที่ส่งคืนจะเป็นเวลา UTC เสมอและส่วนของโซนเวลาของค่าที่ส่งกลับจะเป็น เสมอ+00:00
ความแตกต่างระหว่างฟังก์ชัน UtcNow และ FixedUtcNow
Power Query M มีฟังก์ชันสองฟังก์ชันสําหรับการดึงข้อมูลเวลา UTC ปัจจุบัน:
-
DateTimeZone.UtcNowแสดง UTCdatetimezoneปัจจุบันทุกครั้งที่ประเมินนิพจน์ -
DateTimeZone.FixedUtcNowส่งกลับค่าภายในdatetimezoneเครื่องหนึ่งครั้งต่อการประเมินคิวรี ซึ่งทําหน้าที่เป็นสแนปช็อต
ความแตกต่างระหว่างฟังก์ชันทั้งสองนี้จะคล้ายกับLocalNowฟังก์ชัน และFixedLocalNow อย่างไรก็ตาม ไม่ว่าจะเรียกใช้ฟังก์ชันใน Power Query Desktop หรือ Power Query Online ค่าที่ส่งกลับจะแสดงเป็นเวลา UTC เสมอ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงความแตกต่างระหว่างสองฟังก์ชันนี้
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
ผลลัพธ์ของตัวอย่างนี้ทั้งใน Power Query Desktop และ Power Query Online คือ:
ผลกระทบต่อฟังก์ชันอื่น ๆ
ฟังก์ชัน Power Query M อื่น ๆ ที่ขึ้นอยู่กับวันที่และเวลาปัจจุบันอาจได้รับผลกระทบจากวิธีการส่งกลับเวลาท้องถิ่นใน Power Query Desktop หรือ Power Query Online ตัวอย่างเช่น ถ้าคุณใช้ DateTimeZone.ToLocal ฟังก์ชันเพื่อแปลงเวลา UTC เป็นเวลาท้องถิ่น ฟังก์ชันจะยังคงส่งกลับเวลา UTC บน Power Query Online
ตัวอย่างอื่นคือฟังก์ชันใด ๆ ที่สามารถใช้เวลาระบบปัจจุบันเป็นพารามิเตอร์ ฟังก์ชันเหล่านี้รวมถึง Date.Month, Date.DayOfYearDateTime.IsInCurrentYearDateTimeZone.ZoneHours หรือฟังก์ชันอื่น ๆ ที่สามารถประเมินวันที่และเวลาปัจจุบันได้
ในฟังก์ชันเหล่านี้ทั้งหมด ถ้าตรรกะของคุณขึ้นอยู่กับว่าค่าอยู่ภายในวัน ชั่วโมง เดือน หรือปีปัจจุบัน ผลลัพธ์อาจแตกต่างกันระหว่างสภาพแวดล้อม ความแตกต่างเหล่านี้ระหว่างสภาพแวดล้อมจะเห็นได้ชัดเจนโดยเฉพาะอย่างยิ่งถ้าคิวรีทํางานใกล้กับขอบเขต (ตัวอย่างเช่น ก่อนหรือหลังเที่ยงคืน วันเริ่มต้นเดือนใหม่ หรือปีใหม่) ถ้าความสอดคล้องกันเป็นสิ่งสําคัญในสภาพแวดล้อมที่แตกต่างกัน ใช้ DateTimeZone.UtcNow ฟังก์ชัน หรือ DateTimeZone.FixedUtcNow เพื่อดึงข้อมูลวันที่และเวลา
แนวทางปฏิบัติที่ดีที่สุดและคำแนะนำ
การเลือกฟังก์ชันเวลาที่เหมาะสมใน Power Query ขึ้นอยู่กับกรณีการใช้งานเฉพาะของคุณ สภาพแวดล้อมที่คิวรีของคุณทํางาน (เดสก์ท็อปเทียบกับออนไลน์) และคุณต้องการการประทับเวลาแบบไดนามิกหรือแบบคงที่หรือไม่ ต่อไปนี้คือแนวทางปฏิบัติที่ดีที่สุดบางประการเพื่อช่วยแนะนําการตัดสินใจของคุณ:
-
มีความชัดเจนเกี่ยวกับโซนเวลา: ใช้ฟังก์ชัน DateTimeZone แทนฟังก์ชัน DateTime เมื่อบริบทโซนเวลามีความสําคัญ ใช้
DateTimeZone.UtcNowหรือDateTimeZone.FixedUtcNowเพื่อความสอดคล้องกันในสภาพแวดล้อม ต่าง ๆ โดยเฉพาะในโซลูชันบนระบบคลาวด์ เช่น บริการของ Power BI -
ใช้ฟังก์ชันคงที่สําหรับผลลัพธ์ที่ทําซ้ําได้: ใช้ตัวแปรคงที่ (เช่น
DateTimeZone.FixedUtcNow) เมื่อคุณต้องการให้ประทับเวลายังคงคงที่ในการประเมินคิวรี วิธีนี้มีประโยชน์โดยเฉพาะอย่างยิ่งสําหรับการบันทึก การตรวจสอบ หรือการจับเวลาในการนําเข้าข้อมูล -
หลีกเลี่ยงฟังก์ชันภายในเครื่องใน Power Query Online: ฟังก์ชันเช่น
DateTime.LocalNowและDateTimeZone.LocalNowส่งกลับเวลา UTC ในโซลูชันบนระบบคลาวด์ เช่น บริการของ Power BI ซึ่งอาจทําให้เกิดความสับสนหรือสมมติฐานที่ไม่ถูกต้อง หากคุณต้องการเวลาท้องถิ่นจริงในบริการ ให้พิจารณาปรับ UTC ด้วยตนเองโดยใช้ออฟเซตที่รู้จัก (แม้ว่าการปรับปรุงนี้อาจเปราะบาง ตัวอย่างเช่น เนื่องจากเวลาออมแสงหรือการตั้งค่าภูมิภาค) - ทดสอบทั้งในสภาพแวดล้อมเดสก์ท็อปและออนไลน์: ทดสอบคิวรีของคุณทั้งใน Power Query Desktop และ Power Query Online เสมอถ้าตรรกะของคุณขึ้นอยู่กับเวลาปัจจุบัน การทดสอบนี้จะช่วยตรวจจับความขัดแย้งในช่วงต้น โดยเฉพาะอย่างยิ่งสําหรับสถานการณ์การรีเฟรชตามกําหนดการ
- บันทึกตรรกะเวลาของคุณ: แสดงความคิดเห็นหรือเอกสารอย่างชัดเจนว่าทําไมใช้ฟังก์ชันเวลาเฉพาะ โดยเฉพาะอย่างยิ่งถ้าคุณกําลังใช้การแก้ปัญหาชั่วคราวสําหรับการจัดการโซนเวลา ข้อมูลนี้ช่วยให้ผู้ทํางานร่วมกันในอนาคตเข้าใจเจตนาเบื้องหลังตรรกะ
- ใช้ UTC สําหรับเวิร์กโฟลว์ตามกําหนดการ: สําหรับการรีเฟรชตามกําหนดการหรือไปป์ไลน์อัตโนมัติ UTC เป็นตัวเลือกที่ปลอดภัยที่สุดและคาดการณ์ได้มากที่สุด ซึ่งจะหลีกเลี่ยงความคลุมเครือที่เกิดจากการเลื่อนเวลาตามฤดูกาลหรือโซนเวลาของภูมิภาค
- ค่าเวลาแคชเมื่อจําเป็น: ถ้าคุณต้องการใช้ประทับเวลาเดียวกันในหลายขั้นตอนในคิวรี ให้กําหนดให้กับตัวแปรที่ด้านบนของคิวรีของคุณโดยใช้ฟังก์ชันคงที่ ตัวแปรนี้ช่วยให้มั่นใจถึงความสอดคล้องตลอดตรรกะการแปลงข้อมูล