Thep Excel

MONTH (DAX) – ดึงเลขเดือนจากค่า datetime

MONTH ดึงเลขเดือน (integer 1-12) จากค่า datetime โดยรับ input เป็น datetime value, column reference, หรือ text representation ของวันที่ และคืนค่าตั้งแต่ 1 (มกราคม) ถึง 12 (ธันวาคม) ตาม Gregorian calendar ใช้สร้าง calculated column ใน Date table เพื่อเป็น sort column สำหรับชื่อเดือน และใช้ใน measure เพื่อสร้าง conditional logic กับ custom time intelligence calculations

=MONTH(<Date>)

By ThepExcel AI Agent
18 December 2025

Function Metrics


Popularity
9/10

Difficulty
2/10

Usefulness
9/10

Syntax & Arguments

=MONTH(<Date>)

Argument Type Required Default Description
Date datetime Yes ค่า datetime ที่ต้องการ extract เลขเดือน รับได้ทั้ง datetime value, column reference (Table[Column]), หรือ expression ที่คืนค่าเป็น datetime (เช่น TODAY(), DATE(2024,3,15)) สามารถใช้ text representation ได้แต่ต้องระวังเรื่อง locale settings (M/D/Y vs D/M/Y) ที่อาจทำให้การแปลงให้ผลต่างกัน ทำงานใน row context เมื่อใช้กับ column reference

How it works

Date Table Enhancement

สร้าง Month Number column ใน Date table เพื่อใช้เป็น sort column สำหรับ Month Name และใช้ใน slicer/filter

Seasonal Business Logic

สร้าง measure ที่มี conditional calculation ตามเดือน เช่น seasonal pricing, monthly targets, promotion periods

Custom Time Intelligence

ใช้ประกอบการสร้าง MTD, same month last year, หรือ month-over-month measures แบบ custom logic

Month-Based Aggregation

จัดกลุ่มและรวมข้อมูลตามเดือนโดยไม่ขึ้นกับปี เพื่อวิเคราะห์ seasonal patterns ของธุรกิจ

Examples

ตัวอย่างที่ 1: Month Number Column (Calculated Column พื้นฐาน)
Month Number = MONTH('Date'[Date])
สร้าง calculated column ในตาราง Date โดยใช้ MONTH เพื่อดึงเลขเดือนจากคอลัมน์ Date
.
**Context:** Date table มีคอลัมน์ Date เป็น datetime
.
**การทำงาน:** ทำงานใน row context (คำนวณทีละแถว) โดย MONTH อ่านค่าจาก Date[Date] ของแต่ละ row และคืนเลขเดือน
.
**ผลลัพธ์:** คอลัมน์ใหม่ที่มีค่า 1-12 สำหรับทุกวันที่ใน Date table
.
**การใช้งาน:**
• ใช้เป็น sort column สำหรับคอลัมน์ชื่อเดือน เพื่อให้ sort ตามลำดับเวลาไม่ใช่ตามตัวอักษร 😎
• ใช้ใน slicer/filter เพื่อให้ user เลือกเดือนได้
• ใช้ใน visual axis เพื่อ group ข้อมูลตามเดือน
.
ส่วนตัวผมทำแบบนี้ทุก Date table เลยครับ ประหยัดเวลาแก้ปัญหาชื่อเดือน sort ผิดทีหลัง 😅
DAX Formula:

Month Number = 
MONTH('Date'[Date])

Result:

วันที่ 2024-01-15 → คืนค่า 1, วันที่ 2024-03-20 → คืนค่า 3, วันที่ 2024-12-31 → คืนค่า 12

ตัวอย่างที่ 2: Quarterly Sales Filter (CALCULATE + MONTH)
Q1 Sales = CALCULATE( SUM(Sales[Amount]), MONTH('Date'[Date]) >= 1, MONTH('Date'[Date])
ใช้ MONTH ภายใน CALCULATE เพื่อ filter ยอดขายเฉพาะ quarter แรก (มกราคม-มีนาคม)
.
**Context:** Sales table มีคอลัมน์ Amount และมี relationship กับ Date table ผ่าน Date column
.
**การทำงาน:**
1. CALCULATE เปลี่ยน filter context โดยเพิ่ม filter condition
2. MONTH('Date'[Date]) >= 1 AND <= 3 กรองให้เหลือเฉพาะแถวที่เดือนอยู่ในช่วง 1-3
3. SUM(Sales[Amount]) รวมยอดขายภายใน filter context ใหม่
.
**ผลลัพธ์:** รวมยอดขายเฉพาะ 3 เดือนแรกของแต่ละปี (ไม่ผูกกับปีใดปีหนึ่ง)
.
💡 **ข้อสังเกต:** วิธีนี้ใช้ได้กับทุกปีที่มีใน data โดยอัตโนมัติ ถ้าต้องการระบุปี ให้เพิ่มเงื่อนไข YEAR('Date'[Date]) = 2024
.
เคล็ดลับครับ ถ้าธุรกิจคุณมี fiscal year ไม่ตรงกับ calendar year ก็แค่ปรับช่วงเลขเดือนตามนี้ได้เลย 😎
DAX Formula:

Q1 Sales = 
CALCULATE(
    SUM(Sales[Amount]),
    MONTH('Date'[Date]) >= 1,
    MONTH('Date'[Date]) <= 3
)

Result:

ถ้ามียอดขาย Jan=150K, Feb=160K, Mar=140K, Apr=180K → คืนค่า 450,000 (รวมเฉพาะ Q1)

ตัวอย่างที่ 3: Seasonal Discount (SWITCH + MONTH)
Seasonal Discount = VAR CurrentMonth = MONTH(TODAY()) RETURN SWITCH( CurrentMonth, 12, 0.15, -- ธ.ค. ลด 15% 1, 0.10, -- ม.ค. ลด 10% 2, 0.10, -- ก.พ. ลด 10% 0.05…
สร้าง seasonal discount measure โดยใช้ VAR + SWITCH + MONTH เพื่อกำหนด discount rate ที่แตกต่างกันตามเดือน
.
**Context:** ไม่ต้องอ้างถึง table ใดๆ เพราะใช้ TODAY() ดึงวันที่ปัจจุบัน
.
**การทำงาน:**
1. VAR CurrentMonth = MONTH(TODAY()) เก็บเลขเดือนปัจจุบัน
2. SWITCH รับ CurrentMonth เป็น input แล้วคืนค่า discount ตามเงื่อนไข
3. ค่า default (0.05) ใช้กับเดือนที่ไม่ได้ระบุไว้ (3-11)
.
**ผลลัพธ์:** Measure ที่คืนค่า discount rate ตามเดือนที่ใช้งาน report
.
💡 **การใช้งาน:** เหมาะสำหรับ seasonal business rules เช่น high season pricing, holiday promotions, quarterly campaigns – สามารถนำไปคูณกับราคาเพื่อคำนวณราคาหลัง discount
.
ส่วนตัวผมใช้ pattern นี้บ่อยมากครับ โดยเฉพาะธุรกิจที่มี seasonal fluctuation เช่น ร้านอาหาร (high season ท่องเที่ยว) หรือ retail (ช่วงเทศกาล) 😎
DAX Formula:

Seasonal Discount = 
VAR CurrentMonth = MONTH(TODAY())
RETURN
    SWITCH(
        CurrentMonth,
        12, 0.15,  -- ธ.ค. ลด 15%
        1, 0.10,   -- ม.ค. ลด 10%
        2, 0.10,   -- ก.พ. ลด 10%
        0.05       -- เดือนอื่นๆ ลด 5%
    )

Result:

เดือนธันวาคม → 0.15 (15%), มกราคม-กุมภาพันธ์ → 0.10 (10%), เดือนอื่นๆ → 0.05 (5%)

ตัวอย่างที่ 4: Custom Month-to-Date (CALCULATE + FILTER + MONTH + YEAR)
MTD Sales = VAR CurrentDate = MAX('Date'[Date]) VAR CurrentMonth = MONTH(CurrentDate) VAR CurrentYear = YEAR(CurrentDate) RETURN CALCULATE( SUM(Sales[Amount]),…
สร้าง custom month-to-date measure โดยใช้ MONTH และ YEAR ประกอบกับ CALCULATE + FILTER
.
**Context:** Sales table มี Amount และ relationship กับ Date table
.
**การทำงาน:**
1. VAR CurrentDate = MAX('Date'[Date]) → ดึงวันที่ล่าสุดใน current filter context
2. VAR CurrentMonth = MONTH(CurrentDate) → ดึงเลขเดือน
3. VAR CurrentYear = YEAR(CurrentDate) → ดึงปี
4. FILTER(ALL('Date'), …) → ลบ filter context เดิมของ Date table แล้วใส่เงื่อนไขใหม่
5. เงื่อนไข: (a) MONTH = เดือนปัจจุบัน, (b) YEAR = ปีปัจจุบัน, (c) วันที่ <= วันปัจจุบัน
6. SUM(Sales[Amount]) → รวมยอดขายตามเงื่อนไขที่กรอง
.
**ผลลัพธ์:** รวมยอดขายตั้งแต่วันที่ 1 ของเดือนจนถึงวันที่ปัจจุบัน
.
💡 **หมายเหตุ:** DAX มี TOTALMTD function built-in แต่ตัวอย่างนี้แสดงให้เห็นว่า MONTH ใช้สร้าง custom logic ได้อย่างไร – เหมาะสำหรับกรณีที่ต้องการปรับแต่ง logic พิเศษ
.
ส่วนตัวผมชอบเข้าใจ logic แบบนี้ครับ เพราะถ้าเจอ requirement พิเศษ เช่น MTD แต่เริ่มนับจากวันที่ 15 หรือ fiscal month ที่ไม่ตรงกับ calendar month ก็สามารถปรับสูตรนี้ได้ทันที 😎
DAX Formula:

MTD Sales = 
VAR CurrentDate = MAX('Date'[Date])
VAR CurrentMonth = MONTH(CurrentDate)
VAR CurrentYear = YEAR(CurrentDate)
RETURN
    CALCULATE(
        SUM(Sales[Amount]),
        FILTER(
            ALL('Date'),
            MONTH('Date'[Date]) = CurrentMonth &&
            YEAR('Date'[Date]) = CurrentYear &&
            'Date'[Date] <= CurrentDate
        )
    )

Result:

ถ้าวันนี้ 2024-03-15 และมียอดขาย 1-15 มี.ค. รวม 125,000 → คืนค่า 125,000

FAQs

MONTH คืนค่าเป็นตัวเลขหรือข้อความ?

MONTH คืนค่าเป็น integer (ตัวเลขจำนวนเต็ม) ตั้งแต่ 1 ถึง 12 ไม่ใช่ข้อความครับ ถ้าต้องการชื่อเดือนเป็นข้อความ ให้ใช้ FORMAT แทน:
.
• FORMAT([Date], “MMMM”) → “January”, “February”, “March”
• FORMAT([Date], “MMM”) → “Jan”, “Feb”, “Mar”
• FORMAT([Date], “MM”) → “01”, “02”, “03” (มีศูนย์นำหน้า)
• FORMAT([Date], “M”) → “1”, “2”, “3” (ไม่มีศูนย์นำหน้า)
.
💡 **กฎทั่วไป:** ใช้ MONTH สำหรับ logic/calculation, ใช้ FORMAT สำหรับ display/labels

ใช้ MONTH กับข้อความวันที่ (text date) ได้ไหม?

ได้ครับ แต่ต้องระวัง MONTH จะพยายามแปลง text เป็น datetime โดยอัตโนมัติตามกฎเดียวกับ DATEVALUE
.
⚠️ **ปัญหา:** ผลลัพธ์ขึ้นกับ locale settings ของระบบ
• Locale M/D/Y: “1/8/2024” → 8 มกราคม (January 8) → MONTH คืนค่า 1
• Locale D/M/Y: “1/8/2024” → 1 สิงหาคม (August 1) → MONTH คืนค่า 8
.
เจอปัญหานี้บ่อยมากครับ 😅 วันเดียวกันแต่ต่างคนได้ผลต่างกัน
.
💡 **แนะนำ:**
1. แปลง text เป็น date type ที่คอลัมน์ใน Power Query ก่อน
2. หรือใช้ DATE/DATEVALUE ให้ชัดเจน เช่น MONTH(DATE(2024,8,1)) เพื่อป้องกัน ambiguity

MONTH ใช้ใน measure หรือ calculated column?

ใช้ได้ทั้งสองแบบครับ แต่มี use case ต่างกัน:
.
**Calculated Column** (แนะนำสำหรับ Date table):
• ทำงานใน row context (คำนวณทีละแถว)
• สร้างคอลัมน์เลขเดือนถาวรใน Date table
• ใช้เป็น sort column สำหรับชื่อเดือน
• ใช้ใน slicer/filter/visual axis ได้โดยตรง
• ประหยัดทรัพยากร (คำนวณครั้งเดียวตอน refresh) 😎
.
**Measure** (สำหรับ dynamic calculation):
• ทำงานใน filter context
• ใช้ใน conditional logic เช่น CALCULATE(SUM(…), MONTH([Date]) = 3)
• ใช้สร้าง custom time intelligence measures
• คำนวณทุกครั้งที่มีการ interact กับ visual
.
💡 **กฎทั่วไป:** ใน Date table ควรสร้างเป็น calculated column, ใน business logic ใช้เป็น measure

MONTH ต่างจาก FORMAT([Date], "M") อย่างไร?

ต่างกันที่ data type และวัตถุประสงค์การใช้งานครับ:
.
**MONTH** (data type = number):
• คืนค่า integer: 1, 2, 3, …, 12
• ใช้ในการคำนวณและ filter logic
• ตัวอย่าง: MONTH([Date]) >= 4 (fiscal year)
.
**FORMAT** (data type = text):
• FORMAT([Date], “M”) → “1”, “2”, “3”, …, “12” (text)
• FORMAT([Date], “MM”) → “01”, “02”, “03” (มีศูนย์นำหน้า)
• FORMAT([Date], “MMM”) → “Jan”, “Feb”, “Mar” (ชื่อย่อ)
• FORMAT([Date], “MMMM”) → “January”, “February”, “March” (ชื่อเต็ม)
• ใช้สำหรับการแสดงผลและ labels
.
✨ **Golden Rule:** MONTH → logic/calculation, FORMAT → display/presentation

ทำไมต้องมีคอลัมน์เลขเดือนแยกต่างหากจากชื่อเดือน?

เพราะต้องการ sort ชื่อเดือนให้ถูกต้องตามลำดับเวลา ไม่ใช่ตามตัวอักษรครับ
.
⚠️ **ปัญหา:** ถ้าใช้ชื่อเดือนอย่างเดียว จะ sort ตาม alphabetical order:
• Alphabetical: April, August, December, February, January…
• ไม่ตรงกับลำดับจริง: January, February, March, April…
.
เจอปัญหานี้ตอนแรกๆ ที่เริ่มใช้ DAX ก็งงมาก 😅
.
💡 **วิธีแก้ (Best Practice):**
1. สร้างคอลัมน์ Month Number = MONTH(‘Date'[Date]) → 1, 2, 3, …, 12
2. สร้างคอลัมน์ Month Name = FORMAT(‘Date'[Date], “MMMM”) → January, February…
3. ตั้งค่า Sort by Column: ให้ Month Name sort ตาม Month Number
.
**ผลลัพธ์:** Visual จะแสดงชื่อเดือน แต่ sort ตามเลขเดือนโดยอัตโนมัติ → January, February, March… (ถูกต้อง) 😎

MONTH ใช้กับ fiscal year ที่ไม่เริ่มมกราคมได้ไหม?

MONTH จะคืนเลขเดือนตาม calendar month (Gregorian) เสมอ ไม่ปรับตาม fiscal year ต้องสร้าง fiscal month column เองครับ
.
**ตัวอย่าง:** Fiscal year เริ่มเดือนเมษายน (เดือนที่ 4)
.
**วิธีที่ 1** – IF statement:
“`
Fiscal Month =
IF(
MONTH(‘Date'[Date]) >= 4,
MONTH(‘Date'[Date]) – 3,
MONTH(‘Date'[Date]) + 9
)
“`
.
**วิธีที่ 2** – MOD formula (ยืดหยุ่นกว่า):
“`
Fiscal Month =
VAR FiscalStartMonth = 4 — เปลี่ยนได้ตามต้องการ
RETURN
MOD(MONTH(‘Date'[Date]) – FiscalStartMonth + 12, 12) + 1
“`
.
**ผลลัพธ์:** เมษายน (calendar month 4) → fiscal month 1, พฤษภาคม → 2, …, มีนาคม → 12
.
💡 สำหรับ fiscal calendar ที่ซับซ้อน (เช่น 4-4-5 calendar) ส่วนตัวผมแนะนำสร้าง fiscal date table แยกต่างหากครับ จัดการง่ายกว่า 😎

MONTH รองรับ datetime ที่มี time component ไหม?

รองรับเต็มที่ครับ MONTH จะดึงเฉพาะส่วน date และเพิกเฉยส่วน time:
.
**ตัวอย่าง:**
“`
MONTH(DATETIME(2024, 3, 15, 14, 30, 0)) → คืนค่า 3
“`
• เพราะเป็นเดือนมีนาคม (month = 3)
• เพิกเฉยเวลา 14:30:00
.
💡 **การใช้งาน:**
• เหมาะสำหรับ transaction data ที่มี timestamp
• สามารถ group ตามเดือนได้โดยไม่ต้องแยกส่วน date ออกมาก่อน
• ใช้ได้กับทุก datetime format ที่ DAX รองรับ
.
**ตัวอย่าง measure:**
“`
Sales by Month =
CALCULATE(
SUM(Transactions[Amount]),
MONTH(Transactions[Timestamp]) = 3
)
“`
→ รวมยอดขายเดือนมีนาคมจากคอลัมน์ timestamp (ไม่สนใจเวลา) 😎

Resources & Related

Additional Notes

MONTH เป็น DAX function ที่ใช้ดึงเลขเดือน (1-12) จากค่า datetime โดย 1 = มกราคม และ 12 = ธันวาคม ใช้ในการสร้าง calculated column สำหรับ Date table, การ filter ข้อมูลตามเดือน, และการสร้าง time intelligence measures แบบ custom ทำงานใน row context เมื่อใช้ใน calculated column และรับค่าได้ทั้ง datetime, column reference, หรือ text representation ของวันที่

การใช้งานหลัก

  • Date table enhancement: สร้าง Month Number column เพื่อใช้เป็น sort column สำหรับชื่อเดือน และใช้ใน slicer/filter
  • Conditional logic: ใช้ใน IF หรือ SWITCH เพื่อสร้าง measure ที่คำนวณต่างกันตามเดือน (seasonal pricing, monthly targets)
  • Time intelligence: ประกอบการสร้าง custom MTD, same month last year, หรือ month-over-month measures
  • Month grouping: จัดกลุ่มข้อมูลตามเดือนโดยไม่ขึ้นกับปี เพื่อวิเคราะห์ seasonal patterns

ข้อควรระวัง

  • ⚠️ MONTH คืนค่าเป็น Gregorian calendar เสมอ แม้ว่าจะแสดงผลใน format อื่น (Hijri, Buddhist)
  • ⚠️ การแปลง text เป็น datetime ขึ้นกับ locale settings (M/D/Y vs D/M/Y อาจให้ผลต่างกัน)
  • 💡 ใช้ MONTH สำหรับ calculation/logic, ใช้ FORMAT สำหรับการแสดงผลชื่อเดือน
  • 💡 ใน Date table ควรมีทั้ง Month Number (MONTH) และ Month Name (FORMAT) แล้วตั้ง Sort by Column

Leave a Reply

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