Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

รวมยอด Amount ของเดือนปัจจุบันใน MySQL ด้วย SUM และ MONTH

การเตรียมข้อมูล

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;