Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Chuyển chuỗi "1h 15 min" thành 75 phút trong MySQL?

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ây
  • 4500 / 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ĩaVí dụ
%HGiờ 24h (00-23)14
%h / %IGiờ 12h (01-12)02
%iPhút (00-59)30
%sGiây (00-59)45
%pAM/PMPM
%fMicrosecond (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;