แก้ไข Date Format ที่ผิด: STR_TO_DATE()
เมื่อข้อมูล Date เก็บในรูปแบบผิด (เช่น Year-Day-Month) ใช้ STR_TO_DATE(str, format) Parse ให้กลายเป็น DATE Type ที่ถูกต้อง
ตัวอย่าง: Format ผิด YYYY-DD-MM
CREATE TABLE DemoTable630 (ArrivalDate VARCHAR(100));
INSERT INTO DemoTable630 VALUES
('2015-21-01'), ('2018-25-12'), ('2019-15-07'), ('2016-31-03');
Query แปลง: Pattern '%Y-%d-%m' (Year-Day-Month)
SELECT STR_TO_DATE(ArrivalDate, '%Y-%d-%m') FROM DemoTable630;
ผลลัพธ์:
+-------------------------------------+
| STR_TO_DATE(ArrivalDate, '%Y-%d-%m') |
+-------------------------------------+
| 2015-01-21 |
| 2018-12-25 |
| 2019-07-15 |
| 2016-03-31 |
+-------------------------------------+
Format Specifiers สำหรับ STR_TO_DATE
| Specifier | ความหมาย | ตัวอย่าง Input |
|---|---|---|
| %Y | ปี 4 หลัก | 2024 |
| %y | ปี 2 หลัก | 24 |
| %m | เดือน 2 หลัก (01-12) | 01 |
| %c | เดือน 1-2 หลัก (1-12) | 1 |
| %d | วัน 2 หลัก (01-31) | 21 |
| %e | วัน 1-2 หลัก (1-31) | 21 |
| %H | ชั่วโมง 24h (00-23) | 14 |
| %h/%I | ชั่วโมง 12h (01-12) | 02 |
| %i | นาที (00-59) | 30 |
| %s | วินาที (00-59) | 45 |
| %p | AM/PM | PM |
รูปแบบทั่วไปในไทยและการ Parse
-- 21/01/2024
STR_TO_DATE('21/01/2024', '%d/%m/%Y')
-- 21-ม.ค.-2567
STR_TO_DATE('21-ม.ค.-2567', '%d-%b-%Y') -- ต้อง Set lc_time_names = 'th_TH'
-- 2024-01-21 14:30:45
STR_TO_DATE('2024-01-21 14:30:45', '%Y-%m-%d %H:%i:%s')
-- ISO 8601
STR_TO_DATE('2024-01-21T14:30:45Z', '%Y-%m-%dT%H:%i:%sZ')
อัปเดตข้อมูลในตาราง (Permanent Fix)
-- 1. เพิ่ม Column ใหม่ Type DATE
ALTER TABLE DemoTable630 ADD COLUMN ArrivalDateFixed DATE;
-- 2. Update ด้วย STR_TO_DATE
UPDATE DemoTable630
SET ArrivalDateFixed = STR_TO_DATE(ArrivalDate, '%Y-%d-%m');
-- 3. ตรวจสอบ แล้ว Drop Column เก่า Rename ใหม่
ALTER TABLE DemoTable630 DROP COLUMN ArrivalDate;
ALTER TABLE DemoTable630 CHANGE ArrivalDateFixed ArrivalDate DATE;
Generated Column (MySQL 5.7+) - Auto Parse
ALTER TABLE DemoTable630
ADD COLUMN ArrivalDateParsed DATE
GENERATED ALWAYS AS (STR_TO_DATE(ArrivalDate, '%Y-%d-%m')) STORED;
⚠️ Invalid Date Handling
-- Invalid Date เช่น '2024-31-02' (Feb 31)
SELECT STR_TO_DATE('2024-31-02', '%Y-%d-%m'); -- NULL + Warning
-- Strict Mode จะ Error ตอน Insert
SET sql_mode = 'STRICT_TRANS_TABLES';