แชร์ผ่าน


ตัวแปรภายในเครื่อง คงที่ และ UTC ของฟังก์ชันเวลาปัจจุบัน

เมื่อคุณทํางานกับ Power Query ในเครื่องมือ เช่น Excel และ Power BI การจัดการค่าวันที่และเวลาอย่างแม่นยําเป็นสิ่งสําคัญ โดยเฉพาะอย่างยิ่งเมื่อการแปลงข้อมูลของคุณจะขึ้นอยู่กับเวลาปัจจุบัน Power Query มีฟังก์ชันต่าง ๆ ในการดึงข้อมูลวันที่และเวลาปัจจุบัน:

บทความนี้จะสํารวจความแตกต่างระหว่างฟังก์ชันเหล่านี้และอธิบายช่วงเวลาและเหตุผลในการใช้แต่ละฟังก์ชัน นอกจากนี้ยังเน้นรายละเอียดที่สําคัญ แต่มักจะมองข้ามไป 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.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 คือ:

สกรีนช็อตของตารางที่สร้างขึ้นโดย DateTimeZone.LocalNow ด้วยวันที่และเวลาแบบไดนามิก และ DateTimeZone.FixedLocalNow ด้วยวันที่และเวลาคงที่

Note

ถ้าคุณเรียกใช้ตัวอย่างนี้ใน Power Query Online เวลาที่ส่งคืนจะเป็นเวลา UTC เสมอและส่วนของโซนเวลาของค่าที่ส่งกลับจะเป็น เสมอ+00:00

ความแตกต่างระหว่างฟังก์ชัน UtcNow และ FixedUtcNow

Power Query M มีฟังก์ชันสองฟังก์ชันสําหรับการดึงข้อมูลเวลา UTC ปัจจุบัน:

  • DateTimeZone.UtcNow แสดง UTC datetimezone ปัจจุบันทุกครั้งที่ประเมินนิพจน์
  • 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 คือ:

สกรีนช็อตของตารางที่สร้างขึ้นโดย DateTimeZone.UtcNow ด้วยวันที่และเวลาแบบไดนามิก และ DateTimeZone.FixedUtcNow ด้วยวันที่และเวลาคงที่

ผลกระทบต่อฟังก์ชันอื่น ๆ

ฟังก์ชัน 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 เป็นตัวเลือกที่ปลอดภัยที่สุดและคาดการณ์ได้มากที่สุด ซึ่งจะหลีกเลี่ยงความคลุมเครือที่เกิดจากการเลื่อนเวลาตามฤดูกาลหรือโซนเวลาของภูมิภาค
  • ค่าเวลาแคชเมื่อจําเป็น: ถ้าคุณต้องการใช้ประทับเวลาเดียวกันในหลายขั้นตอนในคิวรี ให้กําหนดให้กับตัวแปรที่ด้านบนของคิวรีของคุณโดยใช้ฟังก์ชันคงที่ ตัวแปรนี้ช่วยให้มั่นใจถึงความสอดคล้องตลอดตรรกะการแปลงข้อมูล