เมื่อต้องการค้นหาระเบียนที่ตรงกับวันและเดือนปัจจุบัน (เช่น วันเกิด วันครบรอบ) โดยไม่สนใจปี สามารถใช้ฟังก์ชัน MONTH() และ DAY() แยกส่วนประกอบของวันที่มาเปรียบเทียบ
ตัวอย่างการใช้งาน
สร้างตารางวันครบรอบ:
mysql> CREATE TABLE DemoTable1429 (
-> AnniversaryDate DATE
-> );
เพิ่มข้อมูลปีต่างกัน แต่วัน/เดือนบางส่วนตรงกัน:
mysql> INSERT INTO DemoTable1429 VALUES ('2019-09-29');
mysql> INSERT INTO DemoTable1429 VALUES ('2018-09-27');
mysql> INSERT INTO DemoTable1429 VALUES ('2016-09-28');
mysql> INSERT INTO DemoTable1429 VALUES ('2015-09-29');
ดูข้อมูลและวันที่ปัจจุบัน:
mysql> SELECT * FROM DemoTable1429; +-----------------+ | AnniversaryDate | +-----------------+ | 2019-09-29 | | 2018-09-27 | | 2016-09-28 | | 2015-09-29 | +-----------------+ mysql> SELECT CURDATE(); +------------+ | curdate() | +------------+ | 2019-09-29 | +------------+
ค้นหาระเบียนที่ตรงกับวันและเดือนปัจจุบัน:
mysql> SELECT * FROM DemoTable1429
-> WHERE MONTH(AnniversaryDate) = MONTH(CURDATE())
-> AND DAY(AnniversaryDate) = DAY(CURDATE());
ผลลัพธ์ (เจอ 2 ระเบียน: 2019-09-29 และ 2015-09-29):
+-----------------+ | AnniversaryDate | +-----------------+ | 2019-09-29 | | 2015-09-29 | +-----------------+
ฟังก์ชันวันที่ที่ใช้บ่อย
| ฟังก์ชัน | คำอธิบาย | ตัวอย่างผลลัพธ์ |
|---|---|---|
| YEAR(date) | ดึงปี | 2019 |
| MONTH(date) | ดึงเดือน (1-12) | 9 |
| DAY(date) | ดึงวัน (1-31) | 29 |
| CURDATE() | วันที่ปัจจุบัน | 2019-09-29 |
| NOW() | วันที่-เวลาปัจจุบัน | 2019-09-29 10:30:00 |
การประยุกต์ใช้
- ส่งอีเมลอัตโนมัติในวันเกิดลูกค้า/พนักงาน
- แสดงโปรโมชั่นวันครบรอบบริษัท
- เตือนนัดหมายประจำปี
- รายงานยอดขายเปรียบเทียบเดือนเดียวกันปีก่อน
หมายเหตุประสิทธิภาพ
การใช้ฟังก์ชันบนคอลัมน์ (MONTH(AnniversaryDate)) จะทำให้ Index ไม่ได้ใช้งาน (Non-SARGable) หากตารางใหญ่ ควรพิจารณา:
- เพิ่มคอลัมน์ Month และ Day แยกต่างหาก และสร้าง Index
- ใช้ Generated Column (MySQL 5.7+)
- หรือค้นหาในช่วงวันที่แทน:
WHERE AnniversaryDate BETWEEN '2019-09-29' AND '2019-09-29 23:59:59'(ต้องรู้ปีล่วงหน้า)