Giải pháp: STR_TO_DATE + TIME_TO_SEC
Parse chuỗi thời gian thành TIME, chuyển thành giây, chia 60 ra phút.
Ví dụ minh họa
Tạo bảng
mysql> CREATE TABLE DemoTable (stringDate VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES('1h 15 min'), ('2h 30 min');
Dữ liệu gốc
+------------+ | stringDate | +------------+ | 1h 15 min | | 2h 30 min | +------------+
Truy vấn chuyển đổi
mysql> SELECT
-> TIME_TO_SEC(STR_TO_DATE(stringDate, '%h h %i min')) / 60 AS minutes
-> FROM DemoTable
-> WHERE stringDate REGEXP '[0-9]+h [0-9]+ min';
Kết quả
+----------+ | minutes | +----------+ | 75.0000 | | 150.0000 | +----------+
Giải thích
STR_TO_DATE('1h 15 min', '%h h %i min')→ TIME '01:15:00'%h: Giờ 12h (01-12),%i: Phút (00-59)TIME_TO_SEC('01:15:00')→ 4500 giây4500 / 60→ 75 phút
Xử lý nhiều format (UNION ALL)
SELECT TIME_TO_SEC(STR_TO_DATE(stringDate, '%h h %i min')) / 60 AS minutes FROM DemoTable WHERE stringDate REGEXP '[0-9]+h [0-9]+ min' UNION ALL SELECT TIME_TO_SEC(STR_TO_DATE(stringDate, '%i min')) / 60 FROM DemoTable WHERE stringDate REGEXP '^[0-9]+ min$';
Format specifier thời gian
| Specifier | Ý nghĩa | Ví dụ |
|---|---|---|
%H | Giờ 24h (00-23) | 14 |
%h / %I | Giờ 12h (01-12) | 02 |
%i | Phút (00-59) | 30 |
%s | Giây (00-59) | 45 |
%p | AM/PM | PM |
%f | Microsecond (000000-999999) | 123456 |
Cách tốt hơn: Generated Column (MySQL 5.7+)
ALTER TABLE DemoTable
ADD COLUMN minutes INT AS (
CASE
WHEN stringDate REGEXP '[0-9]+h [0-9]+ min'
THEN TIME_TO_SEC(STR_TO_DATE(stringDate, '%h h %i min')) / 60
WHEN stringDate REGEXP '^[0-9]+ min$'
THEN TIME_TO_SEC(STR_TO_DATE(stringDate, '%i min')) / 60
ELSE NULL
END
) STORED;
→ Tự động tính, có index, query nhanh.
Ứng dụng: Tổng thời lượng
SELECT SUM(
CASE
WHEN duration REGEXP '[0-9]+h [0-9]+ min'
THEN TIME_TO_SEC(STR_TO_DATE(duration, '%h h %i min')) / 60
WHEN duration REGEXP '^[0-9]+ min$'
THEN TIME_TO_SEC(STR_TO_DATE(duration, '%i min')) / 60
ELSE 0
END
) AS total_minutes FROM tasks;