การลบปีออกจากวันที่ด้วย SUBDATE และ INTERVAL
ใช้ SUBDATE() (หรือ DATE_SUB()) กับ INTERVAL 9 YEAR เพื่อลดปีลง 9 ปี (2020 → 2011)
ไวยากรณ์
UPDATE yourTableName
SET yourDateColumn = SUBDATE(yourDateColumn, INTERVAL 9 YEAR);
ตัวอย่างการใช้งาน
สร้างตาราง:
CREATE TABLE ChangeYearFrom2020To2011 (
Id INT NOT NULL AUTO_INCREMENT,
ExpiryDate DATE,
PRIMARY KEY(Id)
);
เพิ่มข้อมูลปี 2020:
INSERT INTO ChangeYearFrom2020To2011(ExpiryDate) VALUES('2020-09-12');
INSERT INTO ChangeYearFrom2020To2011(ExpiryDate) VALUES('2020-12-21');
INSERT INTO ChangeYearFrom2020To2011(ExpiryDate) VALUES('2020-01-29');
INSERT INTO ChangeYearFrom2020To2011(ExpiryDate) VALUES('2020-06-30');
INSERT INTO ChangeYearFrom2020To2011(ExpiryDate) VALUES('2020-12-31');
ลบ 9 ปี:
UPDATE ChangeYearFrom2020To2011
SET ExpiryDate = SUBDATE(ExpiryDate, INTERVAL 9 YEAR);
ผลลัพธ์ (กลายเป็นปี 2011):
+----+------------+
| Id | ExpiryDate |
+----+------------+
| 1 | 2011-09-12 |
| 2 | 2011-12-21 |
| 3 | 2011-01-29 |
| 4 | 2011-06-30 |
| 5 | 2011-12-31 |
+----+------------+
ฟังก์ชันที่เทียบเท่า
-- ทั้งคู่นี้ทำงานเหมือนกัน
SUBDATE(date, INTERVAL 9 YEAR)
DATE_SUB(date, INTERVAL 9 YEAR)
date - INTERVAL 9 YEAR -- shorthand
กรณีพิเศษ: วันที่ 29 กุมภาพันธ์ (Leap Year)
-- 2020-02-29 (leap year) - 9 year = 2011-02-28 (ไม่ใช่ leap year)
SELECT SUBDATE('2020-02-29', INTERVAL 9 YEAR); -- 2011-02-28
MySQL จัดการอัตโนมัติโดยปรับเป็นวันที่สุดท้ายของเดือน
การเปลี่ยนปีเฉพาะ (ไม่ใช่ลบช่วงเวลา)
หากต้องการเปลี่ยนปีเป็นปีเฉพาะ (ไม่ใช่ลบ n ปี):
UPDATE yourTable
SET date_col = STR_TO_DATE(CONCAT('2011-', DATE_FORMAT(date_col, '%m-%d')), '%Y-%m-%d');
คำแนะนำ
- ทดสอบด้วย SELECT ก่อน UPDATE จริง
- Backup ข้อมูลก่อนรัน UPDATE จำนวนมาก
- พิจารณา Timezone หากคอลัมน์เป็น TIMESTAMP