Công thức chuẩn: Năm hiện tại - Năm sinh - (Ngày/tháng hiện tại < Ngày/tháng sinh ? 1 : 0).
Cú pháp
SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(dob_column)
- (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(dob_column, 5)) AS age
FROM table_name;
Giải thích:
YEAR(CURRENT_TIMESTAMP): năm hiện tại.RIGHT(date, 5): lấy chuỗi 'MM-DD' (5 ký tự cuối của 'YYYY-MM-DD').- So sánh chuỗi 'MM-DD' hoạt động đúng vì định dạng cố định.
- Nếu hôm nay chưa đến sinh nhật năm nay → trừ 1.
Ví dụ minh họa
mysql> CREATE TABLE AgeCalculatesDemo (YourDateOfBirth DATETIME);
Query OK, 0 rows affected (0.50 sec)
mysql> INSERT INTO AgeCalculatesDemo VALUES
(DATE_ADD(NOW(), INTERVAL -22 YEAR)),
(DATE_ADD(NOW(), INTERVAL -12 YEAR)),
(DATE_ADD(NOW(), INTERVAL -19 YEAR)),
('2010-04-05');
Query OK, 4 rows affected
Dữ liệu (giả sử NOW = 2018-12-06):
+---------------------+ | YourDateOfBirth | +---------------------+ | 1996-12-06 23:35:26 | | 2006-12-06 23:35:32 | | 1999-12-06 23:35:42 | | 2010-04-05 00:00:00 | +---------------------+
Tính tuổi:
mysql> SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(YourDateOfBirth)
- (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(YourDateOfBirth, 5)) AS YourAge
FROM AgeCalculatesDemo;
Kết quả:
+---------+ | YourAge | +---------+ | 22 | | 12 | | 19 | | 8 | +---------+
Cách thay thế (MySQL 8.0+)
SELECT TIMESTAMPDIFF(YEAR, YourDateOfBirth, CURDATE()) AS Age FROM AgeCalculatesDemo;
TIMESTAMPDIFF tự xử lý logic sinh nhật, chuẩn xác và dễ đọc hơn.
So sánh
| Phương pháp | Phiên bản | Độ phức tạp | Khuyến nghị |
|---|---|---|---|
| Công thức YEAR - YEAR - ... | Tất cả | Phức tạp | MySQL cũ |
| TIMESTAMPDIFF(YEAR, dob, CURDATE()) | MySQL 5.0+ | Đơn giản | Khuyến nghị |
| DATEDIFF(CURDATE(), dob)/365.25 | Tất cả | Sai số nhẹ | Không khuyến nghị |