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

อัปเดตข้อมูลตามปีเฉพาะจากวันที่รูปแบบ DD/MM/YYYY ใน MySQL

ใช้ YEAR(STR_TO_DATE(date_string, '%d/%m/%Y')) เพื่อแยกปีจากวันที่เก็บเป็น VARCHAR แล้วใช้ใน WHERE ของ UPDATE

Syntax

UPDATE table_name 
SET column1 = value1 
WHERE YEAR(STR_TO_DATE(date_column, '%d/%m/%Y')) = target_year;

ตัวอย่างการใช้งาน

1. สร้างตารางและเพิ่มข้อมูล (วันที่แบบ DD/MM/YYYY)

mysql> create table DemoTable1924 ( UserName varchar(20), UserJoiningDate varchar(40) ); Query OK, 0 rows affected (0.00 sec)

mysql> insert into DemoTable1924 values('Chris','10/12/2010'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1924 values('David','20/01/2011'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1924 values('Mike','20/01/2010'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1924 values('Carol','26/04/2013'); Query OK, 1 row affected (0.00 sec)

ข้อมูลทั้งหมด:

mysql> select * from DemoTable1924;
+----------+-----------------+
| UserName | UserJoiningDate |
+----------+-----------------+
| Chris    | 10/12/2010      |
| David    | 20/01/2011      |
| Mike     | 20/01/2010      |
| Carol    | 26/04/2013      |
+----------+-----------------+
4 rows in set (0.00 sec)

2. อัปเดต UserName = 'Robert' สำหรับปี 2010

mysql> update DemoTable1924 set UserName = 'Robert' 
    -> where YEAR(str_to_date(UserJoiningDate, '%d/%m/%Y')) = 2010;
Query OK, 2 rows affected (0.00 sec) Rows matched: 2  Changed: 2  Warnings: 0

3. ตรวจสอบผลลัพธ์

mysql> select * from DemoTable1924;
+----------+-----------------+
| UserName | UserJoiningDate |
+----------+-----------------+
| Robert   | 10/12/2010      |
| David    | 20/01/2011      |
| Robert   | 20/01/2010      |
| Carol    | 26/04/2013      |
+----------+-----------------+
4 rows in set (0.00 sec)

อธิบายฟังก์ชัน

  1. STR_TO_DATE('10/12/2010', '%d/%m/%Y') → DATE '2010-12-10'
  2. YEAR('2010-12-10') → 2010
  3. เปรียบเทียบ = 2010 → True สำหรับ Chris และ Mike

รูปแบบวันที่ STR_TO_DATE ที่พบบ่อย

FormatPatternตัวอย่าง
DD/MM/YYYY%d/%m/%Y31/12/2023
YYYY-MM-DD%Y-%m-%d2023-12-31
MM/DD/YYYY%m/%d/%Y12/31/2023
DD-MM-YYYY%d-%m-%Y31-12-2023
DD Mon YYYY%d %b %Y31 Dec 2023

⚠️ หมายเตือนประสิทธิภาพ

ใช้ Function บน Column ใน WHERE (YEAR(STR_TO_DATE(...))) จะทำให้ Index ไม่ถูกใช้งาน (Non-SARGable)

แนวทางแก้: เพิ่ม Generated Column หรือเก็บวันที่ในชนิด DATE/DATETIME ตรงๆ

ALTER TABLE DemoTable1924 
ADD COLUMN JoiningDate DATE GENERATED ALWAYS AS (STR_TO_DATE(UserJoiningDate, '%d/%m/%Y')) STORED,
ADD INDEX idx_joining_year (JoiningDate);

สรุป: ใช้ YEAR(STR_TO_DATE(varchar_date, 'format')) แยกปีเพื่อ UPDATE/SELECT แต่อาจช้าบนตารางใหญ่ ควร Normalize วันที่เป็น TYPE DATE