ใช้ YEAR(), MONTH(), CURDATE(), DATE_SUB() และ INTERVAL เพื่อสร้างเงื่อนไขดึงข้อมูลในช่วงเดือนที่ข้ามปี (เช่น กรกฎาคมปีที่แล้ว - กรกฎาคมปีนี้)
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1795 (
Name VARCHAR(20),
DueDate DATE
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูลทดสอบ
mysql> INSERT INTO DemoTable1795 VALUES('John', '2018-07-21');
mysql> INSERT INTO DemoTable1795 VALUES('Sam', '2019-10-21');
mysql> INSERT INTO DemoTable1795 VALUES('Sam', '2019-01-10');
mysql> INSERT INTO DemoTable1795 VALUES('Mike', '2018-12-31');
3. แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable1795; +------+------------+ | Name | DueDate | +------+------------+ | John | 2018-07-21 | | Sam | 2019-10-21 | | Sam | 2019-01-10 | | Mike | 2018-12-31 | +------+------------+
4. Query: ดึงข้อมูล เดือน 7-12 ปีที่แล้ว และ เดือน 1-7 ปีนี้
mysql> SELECT * FROM DemoTable1795
WHERE (YEAR(DueDate) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))
AND MONTH(DueDate) BETWEEN 7 AND 12)
OR (YEAR(DueDate) = YEAR(CURRENT_DATE())
AND MONTH(DueDate) BETWEEN 1 AND 7);
สมมติ CURDATE() = '2019-11-30' (ตัวอย่าง)
- ปีที่แล้ว (2018): เดือน 7-12 → John (Jul), Mike (Dec) ✓
- ปีนี้ (2019): เดือน 1-7 → Sam (Jan) ✓, Sam (Oct) ✗ (เดือน 10)
5. ผลลัพธ์
+------+------------+ | Name | DueDate | +------+------------+ | John | 2018-07-21 | | Sam | 2019-01-10 | | Mike | 2018-12-31 | +------+------------+
วิธีเขียนที่อ่านง่ายกว่า (MySQL 8.0+)
SELECT * FROM DemoTable1795 WHERE DueDate >= DATE_SUB(CURDATE(), INTERVAL 5 MONTH) -- 5 เดือนย้อนหลัง AND DueDate <= CURDATE(); -- ถึงวันนี้
หรือใช้ BETWEEN:
WHERE DueDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 MONTH) AND CURDATE()
คำอธิบายฟังก์ชันวันที่
| ฟังก์ชัน | คำอธิบาย |
|---|---|
YEAR(date) | ดึงปี (4 หลัก) |
MONTH(date) | ดึงเดือน (1-12) |
CURDATE() | วันที่ปัจจุบัน (ไม่มีเวลา) |
DATE_SUB(date, INTERVAL n UNIT) | ลบช่วงเวลา |
DATE_ADD(date, INTERVAL n UNIT) | บวกช่วงเวลา |
สรุป
สำหรับ Range ข้ามปี ใช้ Logic แยกปี (YEAR = ปีที่แล้ว AND MONTH IN ...) OR (YEAR = ปีนี้ AND MONTH IN ...) หรือใช้ DATE_SUB(CURDATE(), INTERVAL n MONTH) ซึ่งเข้าใจง่ายกว่าและทนทานต่อการเปลี่ยนปี