ENDOFMONTH คืนตารางวันที่ของวันสิ้นเดือนตามปฏิทิน เหมาะกับ Semi-Additive Calculations เช่น ยอดคงเหลือ, Inventory, หรือ Closing Balance ที่ต้องการ snapshot ณ สิ้นเดือน ไม่ว่าจะมีข้อมูลจริงในวันนั้นหรือไม่
=ENDOFMONTH(<Dates>)
=ENDOFMONTH(<Dates>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Dates | column | Yes | คอลัมน์วันที่จากตารางวันที่/ปฏิทิน หรือ Table Expression ที่คืนค่าวันที่คอลัมน์เดียว |
ดูยอดเงินในบัญชี สินค้าคงคลัง หรือค่าใดๆ ณ วันสิ้นเดือน
ค่าที่ไม่ควรรวมข้ามเวลา เช่น Balance, Headcount, Inventory ต้องดูเป็น snapshot
รายงานที่ต้องการค่า ณ สิ้นเดือนทุกเดือน เช่น Financial Statement
เปรียบเทียบยอดต้นเดือน-ปลายเดือนเพื่อหา Growth หรือ Movement
Closing Balance = CALCULATE( SUM(Balances[Amount]), ENDOFMONTH('Date'[Date]) )Closing Balance =
CALCULATE(
SUM(Balances[Amount]),
ENDOFMONTH('Date'[Date])
)
ยอดคงเหลือ ณ วันสิ้นเดือนของบริบทปัจจุบัน
Inventory Month End = CALCULATE( SUM(Inventory[Quantity]), ENDOFMONTH('Date'[Date]) )Inventory Month End =
CALCULATE(
SUM(Inventory[Quantity]),
ENDOFMONTH('Date'[Date])
)
จำนวนสินค้าคงคลัง ณ วันสิ้นเดือน
-- ถ้าข้อมูลมีถึงแค่วันที่ 28 ม.ค. -- LASTDATE จะคืน 28 ม.ค. (วันสุดท้ายที่มีข้อมูล) Balance LastDate = CALCULATE( SUM(Balances[Amount]), LASTDATE('Date'[Date])…=-- ถ้าข้อมูลมีถึงแค่วันที่ 28 ม.ค.
-- LASTDATE จะคืน 28 ม.ค. (วันสุดท้ายที่มีข้อมูล)
Balance LastDate =
CALCULATE(
SUM(Balances[Amount]),
LASTDATE('Date'[Date])
)
-- ENDOFMONTH จะคืน 31 ม.ค. (วันสิ้นเดือนปฏิทิน)
Balance EndOfMonth =
CALCULATE(
SUM(Balances[Amount]),
ENDOFMONTH('Date'[Date])
)
LASTDATE = ยอด ณ 28 ม.ค.
ENDOFMONTH = BLANK (ไม่มีข้อมูลวันที่ 31)
-- Closing Balance (ยอดปลายเดือน) Closing Balance = CALCULATE( SUM(Balances[Amount]), ENDOFMONTH('Date'[Date]) ) -- Opening Balance (ยอดต้นเดือน = ยอดปลายเดือนก…=-- Closing Balance (ยอดปลายเดือน)
Closing Balance =
CALCULATE(
SUM(Balances[Amount]),
ENDOFMONTH('Date'[Date])
)
-- Opening Balance (ยอดต้นเดือน = ยอดปลายเดือนก่อน)
Opening Balance =
VAR PreviousMonthEnd =
DATEADD(STARTOFMONTH('Date'[Date]), -1, DAY)
RETURN
CALCULATE(
SUM(Balances[Amount]),
PreviousMonthEnd
)
-- หรือใช้ Built-in Function
Opening Balance v2 =
OPENINGBALANCEMONTH(
SUM(Balances[Amount]),
'Date'[Date]
)
Closing = ยอด ณ 31 ม.ค.
Opening = ยอด ณ 31 ธ.ค. (เดือนก่อน)
Monthly Snapshot = VAR ClosingBalance = CALCULATE( SUM(Accounts[Balance]), ENDOFMONTH('Date'[Date]) ) VAR OpeningBalance = CALCULATE( SUM(Accounts[Balance]), DA…Monthly Snapshot =
VAR ClosingBalance =
CALCULATE(
SUM(Accounts[Balance]),
ENDOFMONTH('Date'[Date])
)
VAR OpeningBalance =
CALCULATE(
SUM(Accounts[Balance]),
DATEADD(STARTOFMONTH('Date'[Date]), -1, DAY)
)
VAR Movement = ClosingBalance - OpeningBalance
RETURN
ClosingBalance
ยอดคงเหลือ ณ สิ้นเดือน พร้อม Movement ที่คำนวณได้
Balance Growth = VAR Opening = CALCULATE( SUM(Balances[Amount]), DATEADD(STARTOFMONTH('Date'[Date]), -1, DAY) ) VAR Closing = CALCULATE( SUM(Balances[Amount]),…Balance Growth =
VAR Opening =
CALCULATE(
SUM(Balances[Amount]),
DATEADD(STARTOFMONTH('Date'[Date]), -1, DAY)
)
VAR Closing =
CALCULATE(
SUM(Balances[Amount]),
ENDOFMONTH('Date'[Date])
)
VAR Delta =
IF(
NOT ISBLANK(Opening) && NOT ISBLANK(Closing),
Closing - Opening
)
RETURN
IF(Delta <> 0, Delta)
ส่วนต่างระหว่างยอดต้นเดือน-ปลายเดือน
ENDOFMONTH คืนวันสิ้นเดือนตามปฏิทินเสมอ (เช่น 31, 30, 28/29) ไม่ว่าจะมีข้อมูลหรือไม่
.
LASTDATE คืนวันสุดท้ายที่มีข้อมูลจริงใน filter context
.
ตัวอย่าง: ถ้าข้อมูลมกราคมมีถึงแค่วันที่ 25
– ENDOFMONTH → 31 ม.ค. (อาจได้ BLANK ถ้าไม่มีข้อมูล)
– LASTDATE → 25 ม.ค. (ได้ยอดวันสุดท้ายที่มี)
.
ใช้ ENDOFMONTH เมื่อต้องการวันปฏิทินแน่นอน
ใช้ LASTDATE เมื่อต้องการยอดล่าสุดที่มีจริงๆ
ENDOFMONTH ถูกออกแบบมาเพื่อใช้เป็น filter argument ใน CALCULATE โดยคืนตาราง 1 แถว 1 คอลัมน์
.
DAX จะแปลงเป็น scalar อัตโนมัติเมื่อต้องการ แต่ถ้าต้องการแค่ค่าวันที่ ใช้ EOMONTH หรือ MAX + EOMONTH จะเร็วกว่า
.
ตาม SQLBI แนะนำ: ใช้ ENDOFMONTH/LASTDATE เป็น filter ใน CALCULATE เท่านั้น ถ้าต้องการค่า scalar ให้ใช้ MAX/MIN แทน 💡
ค่าที่ไม่ควรรวมข้ามเวลา เช่น:
.
– Bank Balance: ยอด 1 ม.ค. = 1000, ยอด 2 ม.ค. = 1200 → รวมแล้วได้ 2200 ซึ่งไม่มีความหมาย!
– Inventory: จำนวนสินค้าในคลังแต่ละวัน รวมกันไม่ได้
– Headcount: จำนวนพนักงานแต่ละวัน
.
ค่าพวกนี้ต้องดูเป็น “snapshot” ณ จุดใดจุดหนึ่ง ไม่ใช่รวมกัน
.
Pattern: ใช้ ENDOFMONTH/LASTDATE เพื่อดูค่า ณ จุดเวลาที่ต้องการ 😎
Opening Balance ของเดือนปัจจุบัน = Closing Balance ของเดือนก่อน
.
วิธีที่ 1: ใช้ DATEADD
Opening = CALCULATE([Balance], DATEADD(STARTOFMONTH(‘Date'[Date]), -1, DAY))
.
วิธีที่ 2: ใช้ Built-in Function
Opening = OPENINGBALANCEMONTH(SUM(Balances[Amount]), ‘Date'[Date])
.
ทั้งสองวิธีให้ผลเหมือนกัน วิธีที่ 2 อ่านง่ายกว่า 💡
ได้ครับ! ใช้กับ Calendar Reference:
.
ENDOFMONTH(FiscalCalendar)
.
จะคืน tagged primary columns ที่ตรงกับสิ้นเดือนของ Fiscal Calendar
.
แต่ต้องตั้งค่า Calendar ให้ถูกต้องก่อนนะครับ
ทำได้ แต่ Microsoft แนะนำว่าไม่ควรใช้ เพราะ “likely returns meaningless results” ในบริบทของ Visual Calculation
.
Time Intelligence functions ควรใช้ใน Measure เท่านั้นครับ 😅
ENDOFMONTH คืนค่าเป็นตารางที่มีวันสิ้นเดือนของบริบทวันที่ปัจจุบัน ใช้เป็น filter argument ใน CALCULATE เพื่อประเมินมาตรวัดที่วันสิ้นเดือน
.
ที่เจ๋งคือ ENDOFMONTH จะคืนค่าวันที่ปฏิทิน (Calendar Date) เสมอ เช่น 31 มกราคม, 28/29 กุมภาพันธ์ ไม่ว่าจะมีข้อมูลจริงในวันนั้นหรือไม่ก็ตาม ซึ่งต่างจาก LASTDATE ที่คืนเฉพาะวันสุดท้ายที่มีข้อมูลจริง
.
ฟังก์ชันนี้สำคัญมากสำหรับ Semi-Additive Calculations เช่น ยอดคงเหลือสินค้า, ยอดเงินในบัญชี, จำนวนพนักงาน ที่ต้องดู “snapshot ณ สิ้นเดือน” แทนที่จะรวมทุกวัน
.
ส่วนตัวผมใช้ ENDOFMONTH คู่กับ CALCULATE บ่อยมากในงาน Financial Reporting เพราะมันรับประกันว่าจะได้วันสิ้นเดือนจริงๆ แม้ข้อมูลจะไม่ครบทุกวันก็ตาม 😎