การใช้ DAY() ร่วมกับ LAST_DAY()
วิธีที่ง่ายที่สุดคือใช้ฟังก์ชัน LAST_DAY() หาวันสุดท้ายของเดือน แล้วค่อยดึง DAY() ออกมา
รูปแบบคำสั่ง
SELECT DAY(LAST_DAY(your_date_column)) AS days_in_month
FROM your_table_name;
ตัวอย่างการใช้งานจริง
1. สร้างตาราง
CREATE TABLE DaysInaGivenMonth (
MonthName DATETIME
);
2. เพิ่มข้อมูล 6 เดือนย้อนหลัง
INSERT INTO DaysInaGivenMonth VALUES
(NOW()),
(DATE_ADD(NOW(), INTERVAL -1 MONTH)),
(DATE_ADD(NOW(), INTERVAL -2 MONTH)),
(DATE_ADD(NOW(), INTERVAL -3 MONTH)),
(DATE_ADD(NOW(), INTERVAL -4 MONTH)),
(DATE_ADD(NOW(), INTERVAL -5 MONTH));
3. หาจำนวนวันในแต่ละเดือน
SELECT
MonthName,
DAY(LAST_DAY(MonthName)) AS DaysInMonth
FROM DaysInaGivenMonth;
ผลลัพธ์
| MonthName | DaysInMonth |
| 2019-01-01 21:34:26 | 31 |
| 2018-12-01 21:34:55 | 31 |
| 2018-11-01 21:35:14 | 30 |
| 2018-10-01 21:35:20 | 31 |
| 2018-09-01 21:35:23 | 30 |
| 2018-08-01 21:35:27 | 31 |
วิธีอื่นๆ
1. ใช้ DATE_FORMAT (ได้ชื่อเดือนด้วย)
SELECT
DATE_FORMAT(MonthName, '%Y-%m') AS YearMonth,
DAY(LAST_DAY(MonthName)) AS DaysInMonth
FROM DaysInaGivenMonth;
2. หาจำนวนวันของเดือนปัจจุบันโดยตรง
SELECT DAY(LAST_DAY(NOW())) AS days_this_month;
3. สร้างฟังก์ชันเก็บไว้ใช้ (Stored Function)
CREATE FUNCTION DaysInMonth(dt DATE)
RETURNS TINYINT UNSIGNED
DETERMINISTIC
RETURN DAY(LAST_DAY(dt));
ตารางจำนวนวันแต่ละเดือน (อ้างอิง)
| เดือน | วัน (ปกติ) | วัน (อธิกสุรทิน) |
| มกราคม | 31 | 31 |
| กุมภาพันธ์ | 28 | 29 |
| มีนาคม | 31 | 31 |
| เมษายน | 30 | 30 |
| พฤษภาคม | 31 | 31 |
| มิถุนายน | 30 | 30 |
| กรกฎาคม | 31 | 31 |
| สิงหาคม | 31 | 31 |
| กันยายน | 30 | 30 |
| ตุลาคม | 31 | 31 |
| พฤศจิกายน | 30 | 30 |
| ธันวาคม | 31 | 31 |