Thep Excel

CALENDARสร้างตารางวันที่โดยอัตโนมัติระหว่างวันเริ่มต้นและสิ้นสุด

CALENDAR ใช้สำหรับสร้างตารางวันที่ครบถ้วนตั้งแต่วันเริ่มต้นถึงวันสิ้นสุดโดยไม่มีช่องว่าง เหมาะสำหรับสร้างตารางวันที่โครงสร้างพื้นฐาน (Date Dimension) ที่ใช้ร่วมกับ Time Intelligence Function

fx
=CALENDAR(<start_date>, <end_date>)

ความนิยม7/10
ความยาก4/10
ประโยชน์8/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
start_date DateTime วันที่เริ่มต้น ตัวอักษร หรือ expression ที่คืนค่า datetime
end_date DateTime วันที่สิ้นสุด ตัวอักษร หรือ expression ที่คืนค่า datetime

Additional Notes

CALENDAR เป็นฟังก์ชันที่ทำงานเรียบง่ายแต่มีประโยชน์มากในการสร้างโครงสร้างข้อมูลเวลา คุณส่งวันที่เริ่มต้นและสิ้นสุด มันจะคืนตารางที่มีคอลัมน์เดียวชื่อ “Date” พร้อมวันที่ทุกวันในช่วงนั้น

ที่เจ๋งคือมันสร้างวันที่ที่ต่อเนื่องกันอย่างสมบูรณ์ ไม่มีช่องว่างเลย ซึ่งสำคัญมากสำหรับฟังก์ชัน Time Intelligence เช่น SAMEPERIODLASTYEAR ที่ต้องการให้ Date Table มีวันที่ครบถ้วน

ส่วนตัวผมใช้ CALENDAR ในเกือบทุกโปรเจคเพื่อสร้างตารางวันที่พื้นฐาน แล้วเพิ่มคอลัมน์อื่นๆ เช่น Year, Month, Quarter ด้วย ADDCOLUMNS หรือ Calculated Column 😎

How it works

สร้าง Date table แบบกำหนดช่วงเอง

เช่น ต้องการให้ครอบคลุมปี 2020-2030 โดยไม่ขึ้นกับข้อมูลธุรกรรม

สร้าง Date table จากช่วงวันที่ในข้อมูล

เช่น ใช้วันแรกสุด/วันสุดท้ายสุดจากคอลัมน์วันที่ในข้อมูลธุรกรรม

Examples

สร้างตารางวันที่แบบง่ายๆCalendar Table = CALENDAR(DATE(2024, 1, 1), DATE(2024, 12, 31))

สร้างตารางวันที่สำหรับปีทั้งปี 2024 โดยตรง ตารางที่ได้จะมี 1 คอลัมน์ชื่อ Date และ 365 แถว (ปี 2024 เป็นปีอธิกสุรทิน)

fx
Calendar Table = CALENDAR(DATE(2024, 1, 1), DATE(2024, 12, 31))

ผลลัพธ์ตารางที่มีวันที่ตั้งแต่ 1 ม.ค. 2024 ถึง 31 ธ.ค. 2024 (365 แถว)
สร้างตารางวันที่แบบไดนามิก (Dynamic Range)Calendar Table = CALENDAR( DATE(YEAR(MIN(Sales[OrderDate])), 1, 1), DATE(YEAR(MAX(Forecast[ForecastDate])), 12, 31) )

ค้นหาปีที่น้อยที่สุดจาก Sales[OrderDate] และปีที่มากที่สุดจาก Forecast[ForecastDate] แล้วสร้างตารางวันที่ที่ครอบคลุมทั้งสองข้อมูล วิธีนี้มี flexibility สูง ถ้าข้อมูลเปลี่ยนตารางวันที่ก็จะปรับตัวอัตโนมัติ

fx
Calendar Table = CALENDAR(
DATE(YEAR(MIN(Sales[OrderDate])), 1, 1),
DATE(YEAR(MAX(Forecast[ForecastDate])), 12, 31)
)

ผลลัพธ์ตารางวันที่ตั้งแต่วันแรกของปีข้อมูล Sales ถึงวันสุดท้ายของปี Forecast
เพิ่มคอลัมน์ Year, Month, Quarter ด้วย ADDCOLUMNSCalendar Table = ADDCOLUMNS( CALENDAR(DATE(2024, 1, 1), DATE(2024, 12, 31)), "Year", YEAR([Date]), "Month", MONTH([Date]), "MonthName", FORMAT([Date], "MMMM"),…

เริ่มจากสร้างตารางวันที่ด้วย CALENDAR แล้วใช้ ADDCOLUMNS เพิ่มคอลัมน์ที่มีประโยชน์ เช่น ปี เดือน ชื่อเดือน และไตรมาส ส่วนตัวผมชอบเพิ่ม MonthName เพราะมันสะดวกสำหรับใช้ใน Visual หรือ Slicer 😎

fx
Calendar Table =
ADDCOLUMNS(
CALENDAR(DATE(2024, 1, 1), DATE(2024, 12, 31)),
"Year", YEAR([Date]),
"Month", MONTH([Date]),
"MonthName", FORMAT([Date], "MMMM"),
"Quarter", "Q" & ROUNDUP(MONTH([Date])/3, 0)
)

ผลลัพธ์ตารางที่มี 5 คอลัมน์: Date, Year, Month, MonthName, Quarter
สร้างตารางวันที่พร้อมกับการหา Min/Max จากข้อมูลหลายตารางCalendar Table = VAR StartDate = DATE(YEAR(MINX(Sales, Sales[OrderDate])), 1, 1) VAR EndDate = DATE(YEAR(MAXX(UNION(Sales, Forecast), COLUMN)), 12, 31) RETURN C…

ใช้ VAR เพื่อหาวันที่เริ่มต้นและสิ้นสุด จากนั้นส่ง VAR ทั้งสองไปให้ CALENDAR นี่คือวิธีที่ดีที่สุดเพราะสามารถ reuse VAR ได้ หรือเพิ่มตรรกะเพิ่มเติมได้ง่าย

fx
Calendar Table =
VAR StartDate = DATE(YEAR(MINX(Sales, Sales[OrderDate])), 1, 1)
VAR EndDate = DATE(YEAR(MAXX(UNION(Sales, Forecast), COLUMN)), 12, 31)
RETURN
CALENDAR(StartDate, EndDate)

ผลลัพธ์ตารางวันที่ที่ครอบคลุมทั้งข้อมูล Sales และ Forecast อย่างสมบูรณ์
สร้าง Date Table พร้อมทั้งหา Last Date ที่มีข้อมูลCalendar Table = VAR MinDate = MINX(Sales, Sales[OrderDate]) VAR MaxDate = MAXX(Sales, Sales[OrderDate]) RETURN CALENDAR( DATE(YEAR(MinDate), 1, 1), DATE(YEAR(M…

กรณีที่ต้องการให้ Date Table ครอบคลุมปีเต็ม (จากวันที่ 1 ม.ค. ถึง 31 ธ.ค.) วิธีนี้ทำให้ Time Intelligence Function ทำงานได้ถูกต้อง เพราะจะมีวันที่ครบถ้วนตั้งแต่ต้นปีถึงปลายปี

fx
Calendar Table =
VAR MinDate = MINX(Sales, Sales[OrderDate])
VAR MaxDate = MAXX(Sales, Sales[OrderDate])
RETURN
CALENDAR(
DATE(YEAR(MinDate), 1, 1),
DATE(YEAR(MaxDate), 12, 31)
)

ผลลัพธ์ตารางวันที่ปีเต็มที่ครอบคลุมข้อมูล Sales ตั้งแต่ต้นปีที่มีข้อมูลถึงสิ้นปีที่มีข้อมูล

FAQs

CALENDAR กับ GENERATESERIES ต่างกันอย่างไร?+

CALENDAR ทำงานกับ Date แต่ GENERATESERIES ทำงานกับตัวเลข ผลลัพธ์เหมือนกันแต่ CALENDAR ส่งคืน Date type ส่วน GENERATESERIES ส่งคืน Numeric ส่วนตัวผมชอบ CALENDAR สำหรับ Date Table เพราะมันเสร็จสรรค์กว่า

ทำไมต้องเพิ่มคอลัมน์ Year, Month ทั้งๆ ที่ Date เก็บข้อมูลเหล่านั้นแล้ว?+

วิธีนี้ดีเพราะ Time Intelligence Function ทำงานได้เร็วกว่า และ Slicer ใน Visual ง่ายต่อการใช้งาน เช่นลักษณ์ "Dec 2024" ชัดเจนกว่า "2024-12-31 00:00:00"

CALENDAR จำนวนแถวสูงสุดเท่าไหร่?+

ไม่มีข้อจำกัด แต่ถ้าช่วงวันที่ยาวเกินไป (เช่น 100 ปี) อาจส่งผลต่อ Performance เล็กน้อย ส่วนตัวผมแนะนำสร้าง Date Table ให้ครอบคลุมข้อมูลเท่านั้น ไม่ต้อง Overkill

ถ้า start_date > end_date จะเกิดอะไร?+

มันจะคืนค่า Error เจอบ่อยครับ 😅 ต้องระวังให้ start_date น้อยกว่า end_date เสมอ หากไม่แน่ใจให้ใช้ MIN() กับ MAX() ก่อน

CALENDAR รองรับ DirectQuery ไหม?+

ไม่รองรับในโหมด DirectQuery สำหรับ Calculated Column หรือ RLS แต่ใช้ได้ใน Calculated Table ปกติ นี่เป็นข้อจำกัด ส่วนตัวผมแนะนำใช้ Import Mode แทน

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ CALENDAR จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้CALENDARDate and Time
Date and Time (3)
CALENDARAUTO

CALENDARAUTO สร้างตารางวันที่อัตโนมัติโดยอิงช่วงวันที่ที่พบในโมเดล และสามารถกำหนดเดือนสิ้นสุดปีบัญชีได้ เหมาะกับการสร้าง Date table แบบเร็ว ๆ แต่ควรระวังค่าวันที่ผิดปกติในข้อมูล

DATE

DATE สร้างค่าวันที่จากตัวเลข Year/Month/Day แล้วคืนค่าเป็นชนิด datetime เหมาะกับการประกอบวันที่จากคอลัมน์แยกส่วนหรือสร้างวันที่อ้างอิง เช่น วันแรกของเดือน วันตัดยอด

DATEVALUE

DATEVALUE แปลงข้อความวันที่ (text) ให้เป็น datetime โดยอ้างอิงตามการตั้งค่า locale ของ model เหมาะกับข้อมูลวันที่ที่เก็บเป็นข้อความและต้องแปลงเป็นวันที่จริงเพื่อการคำนวณตามเวลา

Time Intelligence (3)
DATEADD

DATEADD คืนค่าตารางวันที่ ที่ถูกเลื่อนออกไปจากช่วงวันที่ใน Context ปัจจุบัน ตามจำนวน (NumberOfIntervals) และหน่วย (Interval) ที่กำหนด เช่น เลื่อนย้อนหลัง 1 เดือน หรือเลื่อนไปข้างหน้า 1 ปี

DATESYTD

DATESYTD คืนตารางวันที่ของช่วงตั้งแต่ต้นปีถึงวันที่สุดท้ายที่มองเห็นใน Filter Context ใช้เป็นตัวกรองเวลาใน CALCULATE สำหรับการคำนวณยอดสะสมตั้งแต่ต้นปี รองรับทั้งปีปฏิทินและปีบัญชี (Fiscal Year) ด้วย YearEndDate argument

SAMEPERIODLASTYEAR

SAMEPERIODLASTYEAR คืน table ของวันที่ที่เลื่อนย้อนกลับไป 1 ปีจากช่วงวันที่ใน filter context ปัจจุบัน ใช้สำหรับการเปรียบเทียบ Year-over-Year (YoY) โดยต้องการ date table ที่ครบถ้วนต่อเนื่องและควร mark เป็น date table ในโมเดล
.
มักใช้ร่วมกับ CALCULATE เพื่อคำนวณค่าของปีก่อนหน้าในช่วงเดียวกัน ทำให้ได้ผลลัพธ์แบบ apples-to-apples comparison ที่แม่นยำโดยไม่ต้อง hard-code ช่วงวันที่ เหมาะสำหรับ measures และ calculated columns แต่ไม่รองรับ DirectQuery mode และไม่แนะนำสำหรับ visual calculations

Table manipulation (2)
ADDCOLUMNS

ADDCOLUMNS เป็นฟังก์ชัน table transformation ที่ใช้สำหรับเพิ่มคอลัมน์ใหม่ (Calculated Columns) เข้าไปในตารางที่มีอยู่เดิม โดยคำนวณค่าในแต่ละแถวผ่าน Row Context และส่งคืนตารางเดิมพร้อมคอลัมน์ใหม่ต่อท้าย

GENERATESERIES

GENERATESERIES สร้างตารางคอลัมน์เดียวที่เป็นลำดับตัวเลขจาก StartValue ถึง EndValue ด้วย increment ที่กำหนดได้ เหมาะกับตารางช่วย parameter table หรือสร้างชุดตัวเลขสำหรับ what-if analysis

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่