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

Cách tính tuổi từ ngày sinh (DOB) trong MySQL


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ácHiệu năngKhuyến nghị
YEAR(CURDATE()) - YEAR(dob)Thấp (sai ±1 tuổi)Rất nhanhChỉ ước lượng, báo cáo thô
TIMESTAMPDIFF(YEAR, dob, CURDATE())Cao (chuẩn)NhanhKhuyên dùng cho mọi trường hợp
DATEDIFF(CURDATE(), dob)/365.25Trung bìnhNhanhKhông khuyên dùng

Lưu ý

  • TIMESTAMPDIFF tự động xử lý năm nhuận, tháng ngày
  • Đảm bảo cột DOB kiểu DATE hoặc DATETIME
  • Index trên cột DOB giúp tăng tốc truy vấn lọc theo độ tuổi