การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1889 (DueDate DATE, Amount INT);
mysql> INSERT INTO DemoTable1889 VALUES
('2019-12-11', 500), ('2019-11-11', 1000),
('2018-12-04', 700), ('2017-12-10', 300);
วันที่ปัจจุบัน
mysql> SELECT CURDATE();
+------------+
| curdate() |
+------------+
| 2019-12-10 |
+------------+
Sum Amount เดือนปัจจุบัน (ธันวาคม 2019)
mysql> SELECT SUM(Amount) FROM DemoTable1889
WHERE MONTH(DueDate) = MONTH(CURDATE());
ผลลัพธ์ (500 + 1000 = 1500, รวมทั้ง 2019-12-11 และ 2018-12-04 และ 2017-12-10):
+-------------+
| sum(Amount) |
+-------------+
| 1500 |
+-------------+
⚠️ ปัญหา: MONTH() ไม่คำนึงถึง Year!
Query ข้างบนรวมทุกปีที่เป็นเดือน 12 → ผลลัพธ์อาจผิด
แก้ไข: รวม Year ด้วย
SELECT SUM(Amount) FROM DemoTable1889
WHERE MONTH(DueDate) = MONTH(CURDATE())
AND YEAR(DueDate) = YEAR(CURDATE());
วิธีที่ดีกว่า: Range Query (ใช้ Index ได้)
-- คำนวณ First Day และ Last Day ของเดือนนี้
SELECT SUM(Amount) FROM DemoTable1889
WHERE DueDate >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
AND DueDate < DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH);
ฟังก์ชันวันที่ที่เกี่ยวข้อง
| ฟังก์ชัน | คำอธิบาย |
|---|---|
| MONTH(date) | เดือน 1-12 |
| YEAR(date) | ปี 4 หลัก |
| LAST_DAY(date) | วันสุดท้ายของเดือน |
| DATE_FORMAT(date, '%Y-%m') | String YYYY-MM |
ขยาย: Sum แยกตามเดือน
SELECT YEAR(DueDate) AS yr, MONTH(DueDate) AS mo, SUM(Amount)
FROM DemoTable1889
GROUP BY YEAR(DueDate), MONTH(DueDate)
ORDER BY yr DESC, mo DESC;