STARTOFMONTH คืนวันแรกของเดือนเป็นตาราง 1 แถว ใช้กับการวัดที่ขึ้นต่อจุดเวลา เช่น ยอดคงเหลือ บัญชี หรือสินค้าคงคลัง
=STARTOFMONTH(<Dates>)
=STARTOFMONTH(<Dates>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Dates | dates (table/column expression) | Yes | คอลัมน์วันที่ หรือ table expression ที่ให้คอลัมน์วันที่ เช่น ‘Date'[DateKey] หรือ FILTER(Dates, …) |
ใช้เป็นตัวกรองเพื่อคำนวณ measure ณ จุดเริ่มเดือน
แปลงเป็นค่าเดี่ยวเพื่อใช้แสดงผล/ทำตรรกะต่อ
Start of Month (Scalar) = VAR StartDate = MINX(STARTOFMONTH('Date'[Date]), 'Date'[Date]) RETURN StartDate=Start of Month (Scalar) =
VAR StartDate = MINX(STARTOFMONTH('Date'[Date]), 'Date'[Date])
RETURN
StartDate
ได้วันที่เดียว เช่น 1/1/2024 (สมมติบริบทปัจจุบันคือ January 2024)
Opening Balance = CALCULATE( [Total Amount], STARTOFMONTH('Date'[Date]) )Opening Balance =
CALCULATE(
[Total Amount],
STARTOFMONTH('Date'[Date])
)
ได้ยอดคงเหลือต้นเดือนในบริบทปัจจุบัน เช่น 50,000 บาท
Change from Start of Month = VAR CurrentValue = [Total Amount] VAR StartOfMonthValue = CALCULATE([Total Amount], STARTOFMONTH('Date'[Date])) RETURN CurrentValue…Change from Start of Month =
VAR CurrentValue = [Total Amount]
VAR StartOfMonthValue = CALCULATE([Total Amount], STARTOFMONTH('Date'[Date]))
RETURN
CurrentValue - StartOfMonthValue
ได้ผลต่างระหว่างวันปัจจุบันกับต้นเดือน เช่น +5,000 บาท
Start of Month YoY Comparison = VAR CurrentMonthStart = CALCULATE( [Total Amount], STARTOFMONTH('Date'[Date]) ) VAR PreviousYearStart = CALCULATE( [Total Amount…Start of Month YoY Comparison =
VAR CurrentMonthStart = CALCULATE(
[Total Amount],
STARTOFMONTH('Date'[Date])
)
VAR PreviousYearStart = CALCULATE(
[Total Amount],
STARTOFMONTH('Date'[Date]),
DATEADD('Date'[Date], -1, YEAR)
)
RETURN
CurrentMonthStart - PreviousYearStart
ได้ผลต่างยอดต้นเดือนเทียบกับปีที่แล้ว
คืนค่าเป็นตาราง 1 แถว (single-row table) ซึ่งมีคอลัมน์วันที่ 1 คอลัมน์ ถ้าต้องการค่าเดี่ยว ให้ใช้ MINX หรือ SELECTEDVALUE เพื่อดึงออกมา ส่วนตัวผม มักใช้ MINX ที่ดึงค่าจากคอลัมน์วันที่ออกมาเป็น scalar
เพราะ STARTOFMONTH คืนตาราง ต้องใช้ CALCULATE เพื่อแปลงตาราง 1 แถวนั้นเป็น filter context แล้วใช้เป็นตัวกรองในการคำนวณ measure ถ้าไม่ใช้ CALCULATE ผลลัพธ์จะไม่มีความหมายหรือ error ได้
ทั้งสองมีพฤติกรรมเหมือนกัน แต่ STARTOFMONTH ให้วันแรก (ที่ 1) ของเดือน ส่วน ENDOFMONTH ให้วันสุดท้ายของเดือน (28, 29, 30 หรือ 31 ขึ้นกับเดือน) ใช้ STARTOFMONTH ถ้าต้อง snapshot ต้นเดือน ใช้ ENDOFMONTH ถ้าต้อง snapshot สิ้นเดือน
STARTOFMONTH จะขึ้น error หรือ blank ได้ ต้องให้ Date table ที่สมบูรณ์ มีวันทุกวันตั้งแต่วันแรกถึงวันสุดท้ายของปีที่ต้อง ถ้า Date table ไม่ครบก็ทำให้เกิดปัญหา context ได้ง่าย
ไม่สนับสนุน DirectQuery สำหรับ calculated columns หรือ RLS rules เพราะ STARTOFMONTH ต้องใช้เวลาในการประมวลผล ต้องใช้ Import mode หรือ Dual mode แทน
STARTOFMONTH คืนตารางวันที่ที่มีวันแรกของเดือนในบริบทตัวกรองปัจจุบัน ผลลัพธ์เป็นตาราง 1 แถว (single-row table) ซึ่งมักใช้เป็นตัวกรองใน CALCULATE
ที่เจ๋งคือ STARTOFMONTH ทำให้ตรรกะการวัดที่ขึ้นต่อจุดเวลา (point-in-time measures) ง่ายขึ้น โดยส่วนใหญ่ใช้กับยอดคงเหลือ (balance) บัญชี (account status) หรือสินค้าคงคลัง (inventory) ซึ่งต้องวัดค่า ณ สิ้นหรือต้นเดือน แล้ว STARTOFMONTH จะช่วยกำหนดจุดอ้างอิงนั้นให้แม่นยำ
ส่วนตัวผม พบว่าหลายคน confuse ระหว่าง STARTOFMONTH กับ ENDOFMONTH ผมมักใช้ STARTOFMONTH เมื่อต้อง snapshot ยอดต้นเดือน และ ENDOFMONTH สำหรับยอดสิ้นเดือน ทั้ง 2 ฟังก์ชันต้องจับคู่กับ CALCULATE เพื่อใช้เป็นตัวกรอง จึงเข้าใจ context transition ดีจึงเป็นกุญแจ