---
title: CALENDAR – สร้างตารางวันที่โดยอัตโนมัติระหว่างวันเริ่มต้นและสิ้นสุด
url: https://www.thepexcel.com/functions/dax/date-and-time/calendar-dax/
type: function-explainer
program: DAX
syntax: "CALENDAR(<start_date>, <end_date>)"
date: 2025-12-13
updated: 2025-12-20
scores:
  popularity: 7
  difficulty: 4
  usefulness: 8
---

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

> CALENDAR ใช้สำหรับสร้างตารางวันที่ครบถ้วนตั้งแต่วันเริ่มต้นถึงวันสิ้นสุดโดยไม่มีช่องว่าง เหมาะสำหรับ

## คำอธิบาย

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

## Syntax

```excel
CALENDAR(&lt;start_date&gt;, &lt;end_date&gt;)
```

**Variant**

```excel
CALENDAR(&lt;StartDate&gt;, &lt;EndDate&gt;)
```

สร้างตารางวันที่ต่อเนื่องจากวันเริ่มต้นถึงวันสิ้นสุด

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| start_date | Yes | DateTime |  | วันที่เริ่มต้น ตัวอักษร หรือ expression ที่คืนค่า datetime |
| end_date | Yes | DateTime |  | วันที่สิ้นสุด ตัวอักษร หรือ expression ที่คืนค่า datetime |

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

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

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

_เหมาะกับ:_ fixed-range-date-table

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

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

_เหมาะกับ:_ dynamic-range-date-table

## ตัวอย่าง

### 1. สร้างตารางวันที่แบบง่ายๆ

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

**ผลลัพธ์:** `ตารางที่มีวันที่ตั้งแต่ 1 ม.ค. 2024 ถึง 31 ธ.ค. 2024 (365 แถว)`

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

### 2. สร้างตารางวันที่แบบไดนามิก (Dynamic Range)

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

**ผลลัพธ์:** `ตารางวันที่ตั้งแต่วันแรกของปีข้อมูล Sales ถึงวันสุดท้ายของปี Forecast`

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

### 3. เพิ่มคอลัมน์ Year, Month, Quarter ด้วย ADDCOLUMNS

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

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

### 4. สร้างตารางวันที่พร้อมกับการหา Min/Max จากข้อมูลหลายตาราง

```excel
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 อย่างสมบูรณ์`

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

### 5. สร้าง Date Table พร้อมทั้งหา Last Date ที่มีข้อมูล

```excel
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 ตั้งแต่ต้นปีที่มีข้อมูลถึงสิ้นปีที่มีข้อมูล`

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

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

- ใช้ CALENDAR ร่วมกับ ADDCOLUMNS เพื่อเพิ่มคอลัมน์ Year, Month, Quarter โดยไม่ต้องสร้าง Calculated Column จำนวนมาก

- กำหนด Date Table ว่าเป็น "Date Table" ใน Model settings เพื่อให้ Time Intelligence Function (SAMEPERIODLASTYEAR, DATEADD ฯลฯ) ทำงานได้อย่างสมบูรณ์

- ส่วนตัวผมชอบสร้าง Dynamic Date Range โดยค้นหา MIN/MAX จากข้อมูลจริง แทนที่จะกำหนดปีคงที่ เพราะมันปรับตัวอัตโนมัติเมื่อเพิ่มข้อมูลใหม่

- ถ้าต้องการ Date Table ที่ครอบคลุมหลายปี ให้ใช้ DATE function ด้วย YEAR/MONTH/DAY เพื่อให้ Code อ่านง่าย

- CALENDAR สร้างวันที่ที่ต่อเนื่องกันอย่างสมบูรณ์ ซึ่งสำคัญมากสำหรับ YTD (Year-To-Date) และฟังก์ชันทำนายอื่นๆ 😎

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

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

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

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

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

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

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

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

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

**Q: CALENDAR รองรับ DirectQuery ไหม?**

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

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

- [CALENDARAUTO – สร้างตารางวันที่อัตโนมัติจากช่วงวันที่ในโมเดล](https://www.thepexcel.com/functions/dax/date-and-time/calendarauto-dax/)
- [ADDCOLUMNS – เพิ่มคอลัมน์คำนวณให้ตาราง](https://www.thepexcel.com/functions/dax/table-manipulation/addcolumns-dax/)
- [DATE – สร้างวันที่จากปี เดือน วัน](https://www.thepexcel.com/functions/dax/date-and-time/date-dax/)
- [DATEADD – เลื่อนช่วงเวลาไปข้างหน้าหรือย้อนหลัง (Shift Dates)](https://www.thepexcel.com/functions/dax/time-intelligence/dateadd-dax/)
- [SAMEPERIODLASTYEAR – คืนช่วงเวลาเดียวกันของปีก่อนหน้า (Year-over-Year)](https://www.thepexcel.com/functions/dax/time-intelligence/sameperiodlastyear-dax/)
- [DATESYTD – ชุดวันที่ตั้งแต่ต้นปี (YTD) เพื่อใช้เป็นตัวกรองเวลา](https://www.thepexcel.com/functions/dax/time-intelligence/datesytd-dax/)

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

- [Microsoft Learn: CALENDAR](https://learn.microsoft.com/en-us/dax/calendar-function-dax) _(official)_
- [DAX Guide: CALENDAR](https://dax.guide/calendar/) _(guide)_
- [SQLBI: Date Tables in DAX](https://www.sqlbi.com/articles/creating-a-date-table-in-power-bi/) _(guide)_

---

_Source: [https://www.thepexcel.com/functions/dax/date-and-time/calendar-dax/](https://www.thepexcel.com/functions/dax/date-and-time/calendar-dax/)_
