Yêu cầu
Lọc bản ghi có độ tuổi lớn hơn hoặc bằng một ngưỡng (ví dụ: ≥ 16 tuổi) từ cột DATE OF BIRTH.
Cách 1: Dùng INTERVAL (khuyên dùng)
Tạo bảng:
CREATE TABLE DemoTable611 (DOB DATE);
INSERT INTO DemoTable611 VALUES
('1996-04-21'), ('2001-01-31'), ('2004-12-21'), ('2000-02-03');
Truy vấn người ≥ 16 tuổi (tính đến ngày hiện tại):
SELECT * FROM DemoTable611
WHERE DOB >= (CURDATE() - INTERVAL 16 YEAR);
Giả sử CURDATE() = '2019-03-04', kết quả:
+------------+
| DOB |
+------------+
| 2004-12-21 |
+------------+
Cách 2: Tính tuổi chính xác (năm tròn)
SELECT *,
TIMESTAMPDIFF(YEAR, DOB, CURDATE()) AS age
FROM DemoTable611
WHERE TIMESTAMPDIFF(YEAR, DOB, CURDATE()) >= 16;
Cách 3: Tính tuổi chính xác (có tháng/ngày)
SELECT *,
FLOOR(DATEDIFF(CURDATE(), DOB) / 365.25) AS approx_age
FROM DemoTable611;
So sánh các phương pháp
| Phương pháp | Độ chính xác | Hiệu năng | Dùng index |
|---|---|---|---|
| DOB >= CURDATE() - INTERVAL | Tuổi "ít nhất" (chưa tính tháng/ngày) | Cao (sargable) | ✓ Có |
| TIMESTAMPDIFF(YEAR, ...) | Chính xác năm tròn | Trung bình | ✗ Không |
| DATEDIFF / 365.25 | Xấp xỉ | Thấp | ✗ Không |
Best Practice
- Dùng
DOB <= DATE_SUB(CURDATE(), INTERVAL 16 YEAR)cho filter (có index). - Dùng
TIMESTAMPDIFFcho hiển thị tuổi chính xác. - Tránh function trên cột trong WHERE nếu muốn dùng index.