---
title: STARTOFMONTH – วันแรกของเดือนในบริบทปัจจุบัน
url: https://www.thepexcel.com/functions/dax/time-intelligence/startofmonth-dax/
type: function-explainer
program: DAX
syntax: "STARTOFMONTH(<Dates>)"
date: 2025-12-13
updated: 2025-12-25
scores:
  popularity: 6
  difficulty: 3
  usefulness: 6
---

# STARTOFMONTH – วันแรกของเดือนในบริบทปัจจุบัน

> STARTOFMONTH คืนวันแรกของเดือนเป็นตาราง 1 แถว ใช้กับการวัดที่ขึ้นต่อจุดเวลา เช่น ยอดคงเหลือ บัญชี หร

## คำอธิบาย

STARTOFMONTH คืนวันแรกของเดือนเป็นตาราง 1 แถว ใช้กับการวัดที่ขึ้นต่อจุดเวลา เช่น ยอดคงเหลือ บัญชี หรือสินค้าคงคลัง

## Syntax

```excel
STARTOFMONTH(&lt;Dates&gt;)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| Dates | Yes | dates (table/column expression) |  | คอลัมน์วันที่ หรือ table expression ที่ให้คอลัมน์วันที่ เช่น 'Date'[DateKey] หรือ FILTER(Dates, ...) |

## เคสการใช้งาน

### คำนวณค่า ณ วันแรกของเดือน

ใช้เป็นตัวกรองเพื่อคำนวณ measure ณ จุดเริ่มเดือน

_เหมาะกับ:_ value-at-month-start

### แสดงวันที่เริ่มเดือนในรายงาน

แปลงเป็นค่าเดี่ยวเพื่อใช้แสดงผล/ทำตรรกะต่อ

_เหมาะกับ:_ display-month-start-date

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ดึงวันแรกของเดือนเป็นค่าเดี่ยว

```excel
Start of Month (Scalar) =
VAR StartDate = MINX(STARTOFMONTH('Date'[Date]), 'Date'[Date])
RETURN
    StartDate
```

**ผลลัพธ์:** `ได้วันที่เดียว เช่น 1/1/2024 (สมมติบริบทปัจจุบันคือ January 2024)`

STARTOFMONTH คืนตาราง 1 แถว ต้องใช้ MINX หรือ SELECTEDVALUE เพื่อดึงค่า scalar ออกมา ตัวอย่างนี้ใช้ VAR เพื่อเก็บค่าแล้ว RETURN กลับออกมา

### 2. ตัวอย่างที่ 2: ยอดคงเหลือต้นเดือน (Opening Balance)

```excel
Opening Balance =
CALCULATE(
    [Total Amount],
    STARTOFMONTH('Date'[Date])
)
```

**ผลลัพธ์:** `ได้ยอดคงเหลือต้นเดือนในบริบทปัจจุบัน เช่น 50,000 บาท`

STARTOFMONTH ทำ context transition จาก row context เป็น filter context ที่จำกัดวันที่เป็นต้นเดือนเท่านั้น จึงใช้ CALCULATE เพื่อใช้ STARTOFMONTH เป็นตัวกรอง ถ้าเดือน January ก็จะเลือกวันที่ 1/1 เท่านั้น

### 3. ตัวอย่างที่ 3: ใช้เปรียบเทียบต้นเดือนกับปัจจุบัน

```excel
Change from Start of Month =
VAR CurrentValue = [Total Amount]
VAR StartOfMonthValue = CALCULATE([Total Amount], STARTOFMONTH('Date'[Date]))
RETURN
    CurrentValue - StartOfMonthValue
```

**ผลลัพธ์:** `ได้ผลต่างระหว่างวันปัจจุบันกับต้นเดือน เช่น +5,000 บาท`

ใช้ VAR ที่ 2 ตัว เพื่อเก็บค่าปัจจุบันและค่าต้นเดือน แล้ว RETURN ส่วนต่างออกมา ทำให้เห็นว่ายอดเปลี่ยนแปลงเท่าไหร่ตั้งแต่ต้นเดือนมา

### 4. ตัวอย่างที่ 4: การเปรียบเทียบกับเดือนที่แล้ว

```excel
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
```

**ผลลัพธ์:** `ได้ผลต่างยอดต้นเดือนเทียบกับปีที่แล้ว`

ใช้ STARTOFMONTH กับ DATEADD ร่วมกัน เพื่อหา start of month ในปีที่แล้ว โปรดสังเกต DATEADD เป็น row context function ที่ได้ผล ต้องใช้ CALCULATE เพื่อแปลง context ให้ DATEADD ทำงานได้

## หมายเหตุเพิ่มเติม

- ผมแนะนำให้เริ่มด้วย MINX(STARTOFMONTH(...), ...) ก่อน ถ้าต้อง scalar value เพื่อให้เห็นว่าวันแรกของเดือนคืออะไร จากนั้นค่อยสร้าง measure ที่ซับซ้อนขึ้นด้วย CALCULATE

- ส่วนตัวผม ถ้าต้องงาน point-in-time measure ได้ 3-4 อย่างพร้อมกัน (opening, closing, min, max) ผมใช้ VAR สำหรับแต่ละอันแล้ว RETURN ทีเดียวเลย ง่ายกว่า nested CALCULATE หลายชั้น

- ระวัง context transition ตอนใช้ STARTOFMONTH ใน iterator เช่น SUMX ถ้าใช้ STARTOFMONTH ข้างในเลย มันจะแปลง row context เป็น filter context แล้วอาจได้ผลลัพธ์ไม่ตรงที่คิด ต้องใช้ CALCULATE เพื่อควบคุม context ให้แม่นยำ

- Date table ต้องมี relationship ที่ถูกต้อง โดยทั่วไปคือ Fact table จะมีวันที่ที่เชื่อมไปยัง Date[Date] ต้องตั้ง Mark as Date Table ให้ DAX รู้ว่าตารางนี้เป็น date table ปล่อยให้ DAX เลือก date column

## คำถามที่พบบ่อย

**Q: STARTOFMONTH คืนค่าเป็นตารางหรือค่าเดี่ยว?**

คืนค่าเป็นตาราง 1 แถว (single-row table) ซึ่งมีคอลัมน์วันที่ 1 คอลัมน์ ถ้าต้องการค่าเดี่ยว ให้ใช้ MINX หรือ SELECTEDVALUE เพื่อดึงออกมา ส่วนตัวผม มักใช้ MINX ที่ดึงค่าจากคอลัมน์วันที่ออกมาเป็น scalar

**Q: ทำไมต้อง CALCULATE กับ STARTOFMONTH?**

เพราะ STARTOFMONTH คืนตาราง ต้องใช้ CALCULATE เพื่อแปลงตาราง 1 แถวนั้นเป็น filter context แล้วใช้เป็นตัวกรองในการคำนวณ measure ถ้าไม่ใช้ CALCULATE ผลลัพธ์จะไม่มีความหมายหรือ error ได้

**Q: STARTOFMONTH กับ ENDOFMONTH ต่างกันอย่างไร?**

ทั้งสองมีพฤติกรรมเหมือนกัน แต่ STARTOFMONTH ให้วันแรก (ที่ 1) ของเดือน ส่วน ENDOFMONTH ให้วันสุดท้ายของเดือน (28, 29, 30 หรือ 31 ขึ้นกับเดือน) ใช้ STARTOFMONTH ถ้าต้อง snapshot ต้นเดือน ใช้ ENDOFMONTH ถ้าต้อง snapshot สิ้นเดือน

**Q: ถ้า Date column ไม่มี 1 ม.ค. ใน filter context จะเกิดอะไร?**

STARTOFMONTH จะขึ้น error หรือ blank ได้ ต้องให้ Date table ที่สมบูรณ์ มีวันทุกวันตั้งแต่วันแรกถึงวันสุดท้ายของปีที่ต้อง ถ้า Date table ไม่ครบก็ทำให้เกิดปัญหา context ได้ง่าย

**Q: STARTOFMONTH ใช้ได้กับ DirectQuery mode หรือ?**

ไม่สนับสนุน DirectQuery สำหรับ calculated columns หรือ RLS rules เพราะ STARTOFMONTH ต้องใช้เวลาในการประมวลผล ต้องใช้ Import mode หรือ Dual mode แทน

## ฟังก์ชันที่เกี่ยวข้อง

- endofmonth
- startofquarter
- datesmtd
- calculate
- minx
- lastdate
- datesbetween
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)

## แหล่งข้อมูลเพิ่มเติม

- [DAX Guide: STARTOFMONTH](https://dax.guide/startofmonth/) _(guide)_
- [Microsoft Learn: STARTOFMONTH Function](https://learn.microsoft.com/en-us/dax/startofmonth-function-dax) _(official)_
- [SQLBI: Time Intelligence in DAX](https://sqlbi.com/articles/time-intelligence-in-dax/) _(guide)_

---

_Source: [https://www.thepexcel.com/functions/dax/time-intelligence/startofmonth-dax/](https://www.thepexcel.com/functions/dax/time-intelligence/startofmonth-dax/)_
