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

MySQL Query ดึงข้อมูลในช่วงเดือน (Range of Months) ข้ามปี

ใช้ 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) ซึ่งเข้าใจง่ายกว่าและทนทานต่อการเปลี่ยนปี