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>)
=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 |
สร้าง Month Number column ใน Date table เพื่อใช้เป็น sort column สำหรับ Month Name และใช้ใน slicer/filter
สร้าง measure ที่มี conditional calculation ตามเดือน เช่น seasonal pricing, monthly targets, promotion periods
ใช้ประกอบการสร้าง MTD, same month last year, หรือ month-over-month measures แบบ custom logic
จัดกลุ่มและรวมข้อมูลตามเดือนโดยไม่ขึ้นกับปี เพื่อวิเคราะห์ seasonal patterns ของธุรกิจ
Month Number = MONTH('Date'[Date])Month Number =
MONTH('Date'[Date])
วันที่ 2024-01-15 → คืนค่า 1, วันที่ 2024-03-20 → คืนค่า 3, วันที่ 2024-12-31 → คืนค่า 12
Q1 Sales = CALCULATE( SUM(Sales[Amount]), MONTH('Date'[Date]) >= 1, MONTH('Date'[Date])Q1 Sales =
CALCULATE(
SUM(Sales[Amount]),
MONTH('Date'[Date]) >= 1,
MONTH('Date'[Date]) <= 3
)
ถ้ามียอดขาย Jan=150K, Feb=160K, Mar=140K, Apr=180K → คืนค่า 450,000 (รวมเฉพาะ Q1)
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 =
VAR CurrentMonth = MONTH(TODAY())
RETURN
SWITCH(
CurrentMonth,
12, 0.15, -- ธ.ค. ลด 15%
1, 0.10, -- ม.ค. ลด 10%
2, 0.10, -- ก.พ. ลด 10%
0.05 -- เดือนอื่นๆ ลด 5%
)
เดือนธันวาคม → 0.15 (15%), มกราคม-กุมภาพันธ์ → 0.10 (10%), เดือนอื่นๆ → 0.05 (5%)
MTD Sales = VAR CurrentDate = MAX('Date'[Date]) VAR CurrentMonth = MONTH(CurrentDate) VAR CurrentYear = YEAR(CurrentDate) RETURN CALCULATE( SUM(Sales[Amount]),…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
)
)
ถ้าวันนี้ 2024-03-15 และมียอดขาย 1-15 มี.ค. รวม 125,000 → คืนค่า 125,000
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 เป็น 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
ใช้ได้ทั้งสองแบบครับ แต่มี 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
ต่างกันที่ 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 จะคืนเลขเดือนตาม 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 จะดึงเฉพาะส่วน 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 (ไม่สนใจเวลา) 😎
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 ของวันที่