Công thức cơ bản
Trừ năm hiện tại cho năm sinh (đơn giản nhưng chưa chính xác tuyệt đối):
SELECT ten_cot, YEAR(CURDATE()) - YEAR(cot_ngay_sinh) AS tuoi FROM ten_bang;
Ví dụ chi tiết
1. Tạo bảng
mysql> CREATE TABLE AgeDemo ( -> StudentId INT, -> StudentName VARCHAR(100), -> StudentDOB DATE -> ); Query OK, 0 rows affected (0.61 sec)
2. Chèn dữ liệu
mysql> INSERT INTO AgeDemo VALUES(1,'John','1998-10-1'); Query OK, 1 row affected (0.20 sec) mysql> INSERT INTO AgeDemo VALUES(2,'Carol','1990-1-2'); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO AgeDemo VALUES(3,'Sam','2000-12-1'); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO AgeDemo VALUES(4,'Mike','2010-10-11'); Query OK, 1 row affected (0.18 sec)
3. Tính tuổi
mysql> SELECT StudentName, StudentDOB, YEAR(CURDATE()) - YEAR(StudentDOB) AS StudentAge FROM AgeDemo;
+-------------+------------+------------+ | StudentName | StudentDOB | StudentAge | +-------------+------------+------------+ | John | 1998-10-01 | 21 | | Carol | 1990-01-02 | 29 | | Sam | 2000-12-01 | 19 | | Mike | 2010-10-11 | 9 | +-------------+------------+------------+ 4 rows in set (0.03 sec)
Vấn đề của phương pháp đơn giản
Chưa tính đến tháng/ngày sinh. Ví dụ: Sinh 31/12/2000, hôm nay 01/01/2024 → Tuổi tính được 24 nhưng thực tế mới 23.
Công thức chính xác (Tính đến tháng/ngày)
SELECT
StudentName,
StudentDOB,
TIMESTAMPDIFF(YEAR, StudentDOB, CURDATE()) AS Tuoi_Chinh_Xac
FROM AgeDemo;
Kết quả so sánh
+-------------+------------+----------------+ | StudentName | StudentDOB | Tuoi_Chinh_Xac | +-------------+------------+----------------+ | John | 1998-10-01 | 25 | | Carol | 1990-01-02 | 34 | | Sam | 2000-12-01 | 23 | | Mike | 2010-10-11 | 13 | +-------------+------------+----------------+
So sánh các hàm
| Hàm | Độ chính xác | Hiệu năng | Khuyến nghị |
|---|---|---|---|
| YEAR(CURDATE()) - YEAR(dob) | Thấp (sai ±1 tuổi) | Rất nhanh | Chỉ ước lượng, báo cáo thô |
| TIMESTAMPDIFF(YEAR, dob, CURDATE()) | Cao (chuẩn) | Nhanh | Khuyên dùng cho mọi trường hợp |
| DATEDIFF(CURDATE(), dob)/365.25 | Trung bình | Nhanh | Không khuyên dùng |
Lưu ý
TIMESTAMPDIFFtự động xử lý năm nhuận, tháng ngày- Đảm bảo cột DOB kiểu
DATEhoặcDATETIME - Index trên cột DOB giúp tăng tốc truy vấn lọc theo độ tuổi