การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1846 (
PurchaseDate DATE
);
mysql> INSERT INTO DemoTable1846 VALUES('2019-01-10');
mysql> INSERT INTO DemoTable1846 VALUES('2019-12-24');
mysql> INSERT INTO DemoTable1846 VALUES('2018-09-21');
mysql> INSERT INTO DemoTable1846 VALUES('2017-10-26');
Query ตามเดือนและปี
mysql> SELECT * FROM DemoTable1846
WHERE MONTH(PurchaseDate) = 12
AND YEAR(PurchaseDate) = 2019;
ผลลัพธ์:
+--------------+
| PurchaseDate |
+--------------+
| 2019-12-24 |
+--------------+
วิธีการอื่นที่มีประสิทธิภาพมากกว่า
ใช้การเปรียบเทียบช่วงวันที่ (Range Query) เพื่อใช้ดัชนีได้:
-- แนะนำ: ใช้ช่วงวันที่
SELECT * FROM DemoTable1846
WHERE PurchaseDate >= '2019-12-01'
AND PurchaseDate < '2020-01-01';
-- หรือใช้ LAST_DAY
SELECT * FROM DemoTable1846
WHERE PurchaseDate BETWEEN '2019-12-01' AND LAST_DAY('2019-12-01');
เหตุผลที่ควรหลีกเลี่ยง MONTH()/YEAR() บนคอลัมน์
- ทำให้ไม่สามารถใช้ Index ได้ (Non-SARGable)
- ต้อง Scan ทุกแถวในตาราง (Full Table Scan)
- ช้าเมื่อข้อมูลเยอะ
ฟังก์ชันวันที่ที่น่าสนใจ
MONTH(date)- เดือน (1-12)YEAR(date)- ปี (4 หลัก)DAY(date)- วัน (1-31)QUARTER(date)- ไตรมาส (1-4)WEEK(date)- สัปดาห์ในปี