Giới thiệu
Khi ngày tháng lưu dưới dạng số nguyên INT (ví dụ: 20190108 = 8/1/2019), MySQL cho phép chuyển đổi trực tiếp sang DATE bằng hàm DATE() (từ MySQL 5.7+).
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Number INT
);
mysql> INSERT INTO DemoTable VALUES (20190108), (20161231), (20170411);
Truy vấn chuyển đổi
mysql> SELECT DATE(Number) FROM DemoTable;
Kết quả
+--------------+ | DATE(Number) | +--------------+ | 2019-01-08 | | 2016-12-31 | | 2017-04-11 | +--------------+
Cách thức hoạt động
MySQL nhận diện số nguyên 8 chữ số theo pattern YYYYMMDD và tự chuyển sang DATE.
⚠️ Điều kiện và hạn chế
- Số phải có **đúng 8 chữ số** (YYYYMMDD).
- Giá trị phải là ngày hợp lệ (không phải 20190230, 20191301...).
- Nếu số 6 chữ số (YYMMDD) hoặc 14 chữ số (YYYYMMDDHHMMSS), DATE() có thể không hoạt động đúng.
Cách chung hơn: STR_TO_DATE (cho mọi định dạng số)
SELECT STR_TO_DATE(CAST(Number AS CHAR), '%Y%m%d') FROM DemoTable;
- Chuyển INT → CHAR → DATE theo pattern.
- Linh hoạt cho YYMMDD (%y%m%d), YYYYMMDDHHMMSS (%Y%m%d%H%i%s)...
Khuyến nghị
Nên lưu ngày tháng bằng kiểu DATE/DATETIME thay vì INT để:
- Đảm bảo tính toàn vẹn (invalid date không insert được).
- Dùng được index, hàm DATE/TIME, so sánh trực tiếp.
- Tiết kiệm dung lượng (DATE 3 bytes vs INT 4 bytes).