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

Có thể tính tuổi từ cột BirthDate trong truy vấn MySQL không?

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.25 là 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 COLUMN lưu tuổi tính toán để index/tìm kiếm nhanh