Có. Sử dụng DATEDIFF() tính số ngày từ ngày sinh đến hôm nay, chia cho 365.25 (trung bình năm nhuận).
Tạo bảng
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> DateOfBirth DATE
-> );
Chèn dữ liệu
mysql> INSERT INTO DemoTable(DateOfBirth) VALUES('2010-01-21');
mysql> INSERT INTO DemoTable(DateOfBirth) VALUES('1993-04-02');
mysql> INSERT INTO DemoTable(DateOfBirth) VALUES('1999-12-01');
mysql> INSERT INTO DemoTable(DateOfBirth) VALUES('1998-11-16');
mysql> INSERT INTO DemoTable(DateOfBirth) VALUES('2004-03-19');
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+----+-------------+ | Id | DateOfBirth | +----+-------------+ | 1 | 2010-01-21 | | 2 | 1993-04-02 | | 3 | 1999-12-01 | | 4 | 1998-11-16 | | 5 | 2004-03-19 | +----+-------------+
Tính tuổi (năm)
mysql> SELECT CAST(DATEDIFF(CURDATE(), DateOfBirth) / 365.25 AS UNSIGNED) AS AGE FROM DemoTable;
+------+ | AGE | +------+ | 9 | | 26 | | 19 | | 20 | | 15 | +------+
Giải thích
DATEDIFF(date1, date2): Trả về date1 - date2 (số ngày, có thể âm)CURDATE(): Ngày hiện tại (không giờ)365.25: Trung bình ngày/năm (tính năm nhuận)CAST(... AS UNSIGNED): Làm tròn xuống (floor) thành số nguyên không dấu
Cách chính xác hơn: So sánh tháng/ngày
SELECT
DateOfBirth,
YEAR(CURDATE()) - YEAR(DateOfBirth) -
(DATE_FORMAT(CURDATE(), '%m-%d') < DATE_FORMAT(DateOfBirth, '%m-%d')) AS Age
FROM DemoTable;
Logic: Tuổi = năm hiện tại - năm sinh - (chưa đến sinh nhật năm nay ? 1 : 0)
Lọc theo khoảng tuổi (20-26)
mysql> SELECT * FROM DemoTable
-> WHERE YEAR(CURDATE()) - YEAR(DateOfBirth) BETWEEN 20 AND 26;
+----+-------------+ | Id | DateOfBirth | +----+-------------+ | 2 | 1993-04-02 | | 3 | 1999-12-01 | | 4 | 1998-11-16 | +----+-------------+
Lưu ý
DATEDIFF/365.25là xấp xỉ, có thể sai ±1 năm quanh sinh nhật- Cách so sánh tháng/ngày chính xác hơn nhưng phức tạp hơn
- Có thể tạo
GENERATED COLUMNlưu tuổi tính toán để index/tìm kiếm nhanh