ใช้ STR_TO_DATE แปลงสตริงเวลาเป็น TIME แล้ว TIME_TO_SEC หาร 60
รูปแบบ '%h h %i min' ตรงกับ "1h 15 min" (ชั่วโมง 12ชม. + นาที) แปลงเป็น TIME แล้ว TIME_TO_SEC() หาเวลาทั้งหมดเป็นวินาที หาร 60 ได้นาที
ตัวอย่างสร้างตารางและข้อมูล
CREATE TABLE DemoTable (stringDate VARCHAR(100));
INSERT INTO DemoTable VALUES ('1h 15 min'), ('2h 30 min');
ข้อมูลในตาราง
+------------+ | stringDate | +------------+ | 1h 15 min | | 2h 30 min | +------------+
คำสั่งแปลงเป็นนาที (รองรับทั้ง "Xh Y min" และ "Y min")
SELECT TIME_TO_SEC(STR_TO_DATE(stringDate, '%h h %i min')) / 60 AS minutes FROM DemoTable WHERE STR_TO_DATE(stringDate, '%h h %i min') IS NOT NULL UNION ALL SELECT TIME_TO_SEC(STR_TO_DATE(stringDate, '%i min')) / 60 AS minutes FROM DemoTable WHERE STR_TO_DATE(stringDate, '%i min') IS NOT NULL;
ผลลัพธ์
+----------+ | minutes | +----------+ | 75.0000 | | 150.0000 | +----------+
คำอธิบาย:
- Query แรก: แปลงรูปแบบ "Xh Y min" → TIME → วินาที → หาร 60 = นาที
- Query ที่สอง: แปลงรูปแบบ "Y min" (ไม่มีชั่วโมง)
UNION ALLรวมผลลัพธ์ทั้งสองรูปแบบWHERE ... IS NOT NULLกรองเฉพาะแถวที่แปลงได้ (หลีกเลี่ยง Warning)
⚠ ข้อจำกัด: %h รองรับ 01-12 (12-hour) หากมีชั่วโมง > 12 ต้องใช้ %H (24-hour) แทน และปรับรูปแบบให้ตรง
วิธีง่ายกว่า (MySQL 8.0+): ใช้ REGEXP ดึงตัวเลข แล้วคำนวณ
SELECT
CAST(REGEXP_SUBSTR(stringDate, '^[0-9]+') AS UNSIGNED) * 60 +
CAST(REGEXP_SUBSTR(stringDate, '[0-9]+(?= min)') AS UNSIGNED)
AS minutes
FROM DemoTable;