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

การค้นหาวันครบรอบใน MySQL โดยเปรียบเทียบวันและเดือนกับวันที่ปัจจุบัน

เมื่อต้องการค้นหาระเบียนที่ตรงกับวันและเดือนปัจจุบัน (เช่น วันเกิด วันครบรอบ) โดยไม่สนใจปี สามารถใช้ฟังก์ชัน 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' (ต้องรู้ปีล่วงหน้า)