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

วิธีแปลงสตริงเวลา "1h 15 min" เป็นนาทีใน MySQL

ใช้ 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;