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
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| Date | datetime | ค่า 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 เป็น 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 ของวันที่
สร้าง 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 ของธุรกิจ
สร้าง 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 ผิดทีหลัง 😅
ใช้ 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 ก็แค่ปรับช่วงเลขเดือนตามนี้ได้เลย 😎
สร้าง 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 (ช่วงเทศกาล) 😎
สร้าง 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 ก็สามารถปรับสูตรนี้ได้ทันที 😎
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) จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
CALENDARAUTO สร้างตารางวันที่อัตโนมัติโดยอิงช่วงวันที่ที่พบในโมเดล และสามารถกำหนดเดือนสิ้นสุดปีบัญชีได้ เหมาะกับการสร้าง Date table แบบเร็ว ๆ แต่ควรระวังค่าวันที่ผิดปกติในข้อมูล
DATE สร้างค่าวันที่จากตัวเลข Year/Month/Day แล้วคืนค่าเป็นชนิด datetime เหมาะกับการประกอบวันที่จากคอลัมน์แยกส่วนหรือสร้างวันที่อ้างอิง เช่น วันแรกของเดือน วันตัดยอด
DATEVALUE แปลงข้อความวันที่ (text) ให้เป็น datetime โดยอ้างอิงตามการตั้งค่า locale ของ model เหมาะกับข้อมูลวันที่ที่เก็บเป็นข้อความและต้องแปลงเป็นวันที่จริงเพื่อการคำนวณตามเวลา
DAY คืนค่าเลขวันของเดือนจากค่าวันที่/เวลา (1–31) เป็นฟังก์ชันพื้นฐานสำหรับการวิเคราะห์ตามวันของเดือน การจัดกลุ่ม และการสร้างคอลัมน์ช่วย
EDATE คืนค่าวันที่ที่ห่างจากวันเริ่มต้นตามจำนวนเดือนที่ระบุ ใช้สำหรับคำนวณวันครบกำหนด หรือวันกำหนดส่งแบบเดือนปกติ
EOMONTH คืนค่าวันสิ้นเดือนของเดือนที่เลื่อนจาก StartDate ตามจำนวน Months (บวก/ลบได้) เหมาะกับการหาวันปิดงวด วันครบกำหนด และการจัดการช่วงเวลาแบบรายเดือน
ดึงเลขนาที (0–59) จากค่าวันที่/วันเวลา และคืนค่าเป็นจำนวนเต็ม
QUARTER คือฟังก์ชันที่แยกหมายเลขไตรมาส (Quarter) จากวันที่ โดยส่งค่า 1-4 แทนไตรมาสของปี ใช้เพื่อจัดกลุ่มข้อมูลตามไตรมาส สร้างลำดับชั้นเวลา และวิเคราะห์ประสิทธิภาพตามรอบปี
WEEKDAY คืนค่าเลขวันในสัปดาห์ (1-7) จากวันที่ที่กำหนด สามารถปรับรูปแบบให้เริ่มจากอาทิตย์หรือจันทร์ได้ตามต้องการ เหมาะสำหรับการแยกวันทำงาน วันหยุด หรือวิเคราะห์พฤติกรรมตามวัน
ดึงปีจากวันที่ในรูปแบบตัวเลข 4 หลัก สำหรับวิเคราะห์ข้อมูลตามปี
YEARFRAC คืนค่าสัดส่วนของปีระหว่าง StartDate และ EndDate โดยเลือกวิธีนับวัน (Basis) ได้ เหมาะกับการวัดช่วงเวลาที่ต้องการผลลัพธ์เป็นจำนวนปีแบบทศนิยม
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่