DATESINPERIOD คืนตารางวันที่แบบเคลื่อนที่ โดยเริ่มจาก StartDate และขยายไปตามจำนวนช่วงและหน่วยที่กำหนด เหมาะกับการทำคำนวณแบบ rolling YTD, rolling average, ย้อนหลัง หรือล่วงหน้าแบบยืดหยุ่น
=DATESINPERIOD(<Dates>, <StartDate>, <NumberOfIntervals>, <Interval>[, <EndBehavior>])
=DATESINPERIOD(<Dates>, <StartDate>, <NumberOfIntervals>, <Interval>[, <EndBehavior>])
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Dates | column | Yes | คอลัมน์วันที่จากตารางวันที่ที่มีการทำเครื่องหมาย (marked date table) หรือปฏิทิน | |
| StartDate | date/datetime | Yes | วันอ้างอิงเริ่มต้นของช่วง (มักเป็น MAX(‘DimDate'[Date]) ในบริบทปัจจุบัน) ถ้า BLANK จะใช้ MIN(Dates) | |
| NumberOfIntervals | number | Yes | จำนวนช่วงที่ต้องการ (ค่าติดลบ=ย้อนหลัง, ค่าบวก=ล่วงหน้า) | |
| Interval | text | Yes | หน่วยของช่วง: DAY, WEEK, MONTH, QUARTER, หรือ YEAR | |
| EndBehavior | enum | Optional | PRECISE | PRECISE (default) = จบบนวันที่กำหนด, ENDALIGNED = จบบนสิ้นสุดของช่วง (เช่นสิ้นสุดเดือน) |
เช่น ยอดย้อนหลัง 3 เดือนจากวันล่าสุดในบริบท
เช่น ยอดย้อนหลัง 14 วันเพื่อดูแนวโน้มระยะสั้น
Sales Last 3 Months = CALCULATE( SUM(Sales[Amount]), DATESINPERIOD( 'DimDate'[Date], MAX('DimDate'[Date]), -3, MONTH ) )Sales Last 3 Months =
CALCULATE(
SUM(Sales[Amount]),
DATESINPERIOD(
'DimDate'[Date],
MAX('DimDate'[Date]),
-3,
MONTH
)
)
ยอดขายรวม 3 เดือนย้อนหลังจากวันล่าสุด (รวมวันนั้นด้วย)
Sales Last 14 Days = CALCULATE( SUM(Sales[Amount]), DATESINPERIOD( 'DimDate'[Date], MAX('DimDate'[Date]), -14, DAY ) )Sales Last 14 Days =
CALCULATE(
SUM(Sales[Amount]),
DATESINPERIOD(
'DimDate'[Date],
MAX('DimDate'[Date]),
-14,
DAY
)
)
ยอดขายรวม 14 วันล่าสุด
Revenue Prior Year = CALCULATE( SUM(Sales[Amount]), DATESINPERIOD( 'DimDate'[Date], MAX('DimDate'[Date]), -1, YEAR ) )Revenue Prior Year =
CALCULATE(
SUM(Sales[Amount]),
DATESINPERIOD(
'DimDate'[Date],
MAX('DimDate'[Date]),
-1,
YEAR
)
)
ยอดขายปีที่แล้ว (ช่วงเดียวกับปีปัจจุบัน)
Revenue This Quarter (Full) = CALCULATE( SUM(Sales[Amount]), DATESINPERIOD( 'DimDate'[Date], MAX('DimDate'[Date]), -1, QUARTER, ENDALIGNED ) )=Revenue This Quarter (Full) =
CALCULATE(
SUM(Sales[Amount]),
DATESINPERIOD(
'DimDate'[Date],
MAX('DimDate'[Date]),
-1,
QUARTER,
ENDALIGNED
)
)
ยอดขายไตรมาสเต็ม โดยปลายสุดจะมีเพียง 30, 31 มกราคม ฯลฯ ขึ้นอยู่กับขอบเขตไตรมาส
ค่าติดลบ (เช่น -3) หมายถึงย้อนหลังจาก StartDate ส่วนค่าบวก (เช่น +3) หมายถึงล่วงหน้าไปจาก StartDate ตัวอย่าง: -3 MONTH จาก 2025-12-31 จะได้ข้อมูล 2025-10-01 ถึง 2025-12-31
DATESBETWEEN ต้องระบุวันเริ่มและวันจบแบบชัดเจน: DATESBETWEEN(Dates, StartDate, EndDate) ส่วน DATESINPERIOD ใช้จำนวนช่วง + หน่วยแทน: DATESINPERIOD(Dates, StartDate, NumberOfIntervals, Interval) DATESINPERIOD ยืดหยุ่นมากกว่าสำหรับการคำนวณแบบ rolling
DATESINPERIOD จะใช้ MIN(Dates) เป็นค่า StartDate แทน อาจไม่ได้ผลลัพธ์ที่คาดหวัง ดังนั้นแนะนำให้ระบุ StartDate ชัดเจน เช่น MAX(‘DimDate'[Date])
ไม่แนะนำใช้กับ DirectQuery mode สำหรับ RLS rules หรือ Calculated Columns อาจมีปัญหาประสิทธิภาพ ควรใช้ Import mode หรือ Aggregations
PRECISE (default): ช่วงจบลงบนวันที่ StartDate ตรงๆ เช่น -1 QUARTER จาก 2025-12-25 = 2025-09-26 ถึง 2025-12-25 | ENDALIGNED: ช่วงจบลงที่ปลายสุดของช่วงที่กำหนด เช่น -1 QUARTER จาก 2025-12-25 = 2025-09-30 ถึง 2025-12-31
DATESINPERIOD คืนค่าเป็น ‘ตารางของวันที่’ ในช่วงแบบเคลื่อนที่ โดยเริ่มจาก StartDate แล้วขยายช่วงไปตามจำนวนช่วง (NumberOfIntervals) และหน่วย (Interval) ที่กำหนด เช่น DAY/WEEK/MONTH/QUARTER/YEAR
ที่เจ๋งคือมันคืนตาราง ไม่ใช่ค่าเดียว ดังนั้นใช้กับ CALCULATE เพื่อกรองข้อมูลในช่วงที่ต้องการได้ สะดวกกว่า DATESBETWEEN ตรงที่ไม่ต้องระบุวันจบแบบชัดเจน
ส่วนตัวผมชอบใช้สำหรับคำนวณ YTD, rolling 30-day sales, หรือเปรียบเทียบกับปีที่แล้ว (Prior Year) เพราะค่อยการแสดงนอน ได้อย่างยืดหยุ่น 😎