Thep Excel

DATESINPERIOD – สร้างช่วงวันที่แบบเคลื่อนที่ (Rolling Period)

DATESINPERIOD คืนตารางวันที่แบบเคลื่อนที่ โดยเริ่มจาก StartDate และขยายไปตามจำนวนช่วงและหน่วยที่กำหนด เหมาะกับการทำคำนวณแบบ rolling YTD, rolling average, ย้อนหลัง หรือล่วงหน้าแบบยืดหยุ่น

=DATESINPERIOD(<Dates>, <StartDate>, <NumberOfIntervals>, <Interval>[, <EndBehavior>])

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
6/10

Difficulty
5/10

Usefulness
6/10

Syntax & Arguments

=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 = จบบนสิ้นสุดของช่วง (เช่นสิ้นสุดเดือน)

How it works

ทำยอดย้อนหลัง N เดือน

เช่น ยอดย้อนหลัง 3 เดือนจากวันล่าสุดในบริบท

ทำยอดย้อนหลัง N วัน

เช่น ยอดย้อนหลัง 14 วันเพื่อดูแนวโน้มระยะสั้น

Examples

ตัวอย่างที่ 1: ยอดขายย้อนหลัง 3 เดือน (Rolling 3-Month Sales)
Sales Last 3 Months = CALCULATE( SUM(Sales[Amount]), DATESINPERIOD( 'DimDate'[Date], MAX('DimDate'[Date]), -3, MONTH ) )
ใช้ MAX('DimDate'[Date]) เป็นจุดอ้างอิง แล้วกำหนด -3 เพื่อให้เป็นช่วง 3 เดือนย้อนหลัง DATESINPERIOD จะคืนตารางวันที่ 3 เดือนนั้น แล้ว CALCULATE เอามาใช้เป็นตัวกรองให้ SUM
DAX Formula:

Sales Last 3 Months =
CALCULATE(
    SUM(Sales[Amount]),
    DATESINPERIOD(
        'DimDate'[Date],
        MAX('DimDate'[Date]),
        -3,
        MONTH
    )
)

Result:

ยอดขายรวม 3 เดือนย้อนหลังจากวันล่าสุด (รวมวันนั้นด้วย)

ตัวอย่างที่ 2: ยอดขาย 14 วันหลังสุด (Rolling 14-Day Sales)
Sales Last 14 Days = CALCULATE( SUM(Sales[Amount]), DATESINPERIOD( 'DimDate'[Date], MAX('DimDate'[Date]), -14, DAY ) )
เหมาะกับการดูแนวโน้มระยะสั้น (Short-term trend) ของยอดขาย ใช้ DAY แทน MONTH เพื่อความละเอียดมากขึ้น
DAX Formula:

Sales Last 14 Days =
CALCULATE(
    SUM(Sales[Amount]),
    DATESINPERIOD(
        'DimDate'[Date],
        MAX('DimDate'[Date]),
        -14,
        DAY
    )
)

Result:

ยอดขายรวม 14 วันล่าสุด

ตัวอย่างที่ 3: เปรียบเทียบยอดขายปีนี้กับปีที่แล้ว (Prior Year YoY)
Revenue Prior Year = CALCULATE( SUM(Sales[Amount]), DATESINPERIOD( 'DimDate'[Date], MAX('DimDate'[Date]), -1, YEAR ) )
ด้วย -1 YEAR DATESINPERIOD จะเลื่อนกลับไปปีก่อนหน้า โดยปกติหากกรองข้อมูล 2025 DATESINPERIOD จะคืนข้อมูล 2024 ที่ตรงกับช่วงเดียวกัน
DAX Formula:

Revenue Prior Year =
CALCULATE(
    SUM(Sales[Amount]),
    DATESINPERIOD(
        'DimDate'[Date],
        MAX('DimDate'[Date]),
        -1,
        YEAR
    )
)

Result:

ยอดขายปีที่แล้ว (ช่วงเดียวกับปีปัจจุบัน)

ตัวอย่างที่ 4: ใช้ EndBehavior สำหรับการจับกลุ่มแบบช่วงเต็ม (ENDALIGNED)
Revenue This Quarter (Full) = CALCULATE( SUM(Sales[Amount]), DATESINPERIOD( 'DimDate'[Date], MAX('DimDate'[Date]), -1, QUARTER, ENDALIGNED ) )
ENDALIGNED ทำให้ช่วงวันที่จบลงในตำแหน่งที่ 'เหมาะสม' เช่น สิ้นสุดไตรมาส เหมาะสำหรับรายงานแบบ fiscal period
DAX Formula:

=Revenue This Quarter (Full) =
CALCULATE(
    SUM(Sales[Amount]),
    DATESINPERIOD(
        'DimDate'[Date],
        MAX('DimDate'[Date]),
        -1,
        QUARTER,
        ENDALIGNED
    )
)

Result:

ยอดขายไตรมาสเต็ม โดยปลายสุดจะมีเพียง 30, 31 มกราคม ฯลฯ ขึ้นอยู่กับขอบเขตไตรมาส

FAQs

ค่าติดลบและค่าบวกของ NumberOfIntervals ต่างกันอย่างไร?

ค่าติดลบ (เช่น -3) หมายถึงย้อนหลังจาก StartDate ส่วนค่าบวก (เช่น +3) หมายถึงล่วงหน้าไปจาก StartDate ตัวอย่าง: -3 MONTH จาก 2025-12-31 จะได้ข้อมูล 2025-10-01 ถึง 2025-12-31

DATESINPERIOD ต่างจาก DATESBETWEEN อย่างไร?

DATESBETWEEN ต้องระบุวันเริ่มและวันจบแบบชัดเจน: DATESBETWEEN(Dates, StartDate, EndDate) ส่วน DATESINPERIOD ใช้จำนวนช่วง + หน่วยแทน: DATESINPERIOD(Dates, StartDate, NumberOfIntervals, Interval) DATESINPERIOD ยืดหยุ่นมากกว่าสำหรับการคำนวณแบบ rolling

ถ้า StartDate เป็น BLANK จะเกิดอะไร?

DATESINPERIOD จะใช้ MIN(Dates) เป็นค่า StartDate แทน อาจไม่ได้ผลลัพธ์ที่คาดหวัง ดังนั้นแนะนำให้ระบุ StartDate ชัดเจน เช่น MAX(‘DimDate'[Date])

DATESINPERIOD ใช้ได้กับ DirectQuery หรือไม่?

ไม่แนะนำใช้กับ DirectQuery mode สำหรับ RLS rules หรือ Calculated Columns อาจมีปัญหาประสิทธิภาพ ควรใช้ Import mode หรือ Aggregations

PRECISE กับ ENDALIGNED ต่างกันอย่างไร?

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

Resources & Related

Additional Notes

DATESINPERIOD คืนค่าเป็น ‘ตารางของวันที่’ ในช่วงแบบเคลื่อนที่ โดยเริ่มจาก StartDate แล้วขยายช่วงไปตามจำนวนช่วง (NumberOfIntervals) และหน่วย (Interval) ที่กำหนด เช่น DAY/WEEK/MONTH/QUARTER/YEAR

ที่เจ๋งคือมันคืนตาราง ไม่ใช่ค่าเดียว ดังนั้นใช้กับ CALCULATE เพื่อกรองข้อมูลในช่วงที่ต้องการได้ สะดวกกว่า DATESBETWEEN ตรงที่ไม่ต้องระบุวันจบแบบชัดเจน

ส่วนตัวผมชอบใช้สำหรับคำนวณ YTD, rolling 30-day sales, หรือเปรียบเทียบกับปีที่แล้ว (Prior Year) เพราะค่อยการแสดงนอน ได้อย่างยืดหยุ่น 😎

Leave a Reply

Your email address will not be published. Required fields are marked *