Quay lại Blog
4 min read

Cách tính tuổi trong SQL (PostgreSQL, MySQL, SQL Server)

Tìm hiểu các mẫu SQL thực tế để tính tuổi từ ngày sinh: số năm hoàn thành, năm và tháng chính xác cũng như tuổi tính đến một ngày cụ thể. Bao gồm các ví dụ cho PostgreSQL, MySQL và SQL Server.

Cách tính tuổi trong SQL (PostgreSQL, MySQL, SQL Server)

Cần tính tuổi trong SQL từ ngày sinh? Hướng dẫn này trình bày các truy vấn thực tế, sẵn sàng sao chép cho các cơ sở dữ liệu phổ biến. Bạn sẽ học cách tính:

  • Tuổi tính bằng năm (số năm đã hoàn thành)
  • Tuổi tính đến một ngày cụ thể (không chỉ hôm nay)
  • Đầu ra kiểu chính xác (năm và tháng) khi bạn cần thêm chi tiết

1) Quyết định ý nghĩa của "tuổi" đối với trường hợp sử dụng của bạn

Hầu hết logic kinh doanh sử dụng năm hoàn thành. Điều đó có nghĩa là người sinh ngày 2000-06-10 sẽ là 25 tuổi vào ngày 10-06-2026, không sớm hơn. Hãy cẩn thận với phép trừ năm đơn giản như YEAR(today) - YEAR(dob), vì nó sai trước ngày sinh nhật.

2) PostgreSQL: tuổi tính bằng năm (năm đã hoàn thành)

PostgreSQL có hàm age() tích hợp sẵn trả về một khoảng. Trích xuất số năm đầy đủ như thế này:

SELECT EXTRACT(YEAR FROM age(CURRENT_DATE, dob)) AS age_year
TỪ mọi người;

PostgreSQL: tuổi tính đến một ngày cụ thể

SELECT EXTRACT(YEAR FROM age(DATE '2026-02-23', dob)) AS age_year
TỪ mọi người;

3) MySQL: tuổi tính theo năm (năm đã hoàn thành)

Trong MySQL, hãy sử dụng TIMESTAMPDIFF:

CHỌN DẤU THỜI GIAN(YEAR, dob, CURDATE()) AS age_year
TỪ mọi người;

MySQL: tuổi kể từ một ngày cụ thể

CHỌN DẤU THỜI GIAN(YEAR, dob, DATE('2026-02-23')) AS age_year
TỪ mọi người;

4) Máy chủ SQL: tuổi tính theo năm (năm đã hoàn thành)

Mẫu phổ biến trong SQL Server là DATEDIFF trừ séc sinh nhật:

CHỌN
  DATEDIFF(YEAR, dob, CAST(GETDATE() AS date))
  - TRƯỜNG HỢP
      KHI DATEADD(YEAR, DATEDIFF(YEAR, dob, CAST(GETDATE() AS date)), dob) > CAST(GETDATE() AS date)
      SAU ĐÓ 1 KHÁC 0
    KẾT THÚC ở độ tuổi_năm
TỪ mọi người;

Máy chủ SQL: tuổi kể từ một ngày cụ thể

Khai báo @as_of date = '2026-02-23';
CHỌN
  DATEDIFF(NĂM, dob, @as_of)
  - TRƯỜNG HỢP
      KHI DATEADD(YEAR, DATEDIFF(YEAR, dob, @as_of), dob) > @as_of
      SAU ĐÓ 1 KHÁC 0
    KẾT THÚC ở độ tuổi_năm
TỪ mọi người;

5) Ví dụ về độ tuổi chính xác (năm và tháng)

Nếu bạn muốn một bản trình bày "chính xác" như "31 năm 4 tháng", hãy tính số năm trước, sau đó là các tháng sau ngày sinh nhật gần đây nhất. Đây là một ví dụ về PostgreSQL:

VỚI cơ sở AS (
  CHỌN dob, CURRENT_DATE AS as_of
  TỪ mọi người
)
CHỌN
  TRÍCH XUẤT(NĂM TỪ tuổi(as_of, dob)) NHƯ năm,
  TRÍCH XUẤT(THÁNG TỪ tuổi(as_of, dob)) NHƯ tháng
TỪ căn cứ;

Những cạm bẫy thường gặp

  • Múi giờ: lưu trữ DOB dưới dạng ngày khi có thể. Ngày giờ có thể thay đổi giữa các vùng.
  • Sinh nhật vào ngày nhuận: xác định những gì xảy ra vào những năm không nhuận. Hầu hết các hệ thống coi ngày sinh nhật 29-02-2004 là ngày 28-02 hoặc 01-03 tùy theo chính sách.
  • DOB không có giá trị hoặc trong tương lai: lọc hoặc bảo vệ, nếu không thìtruy vấn của bạn sẽ trả về giá trị rỗng hoặc giá trị âm.

Kiểm tra nhanh sự tỉnh táo

Nếu muốn xác minh nhanh chóng một DOB, bạn có thể sử dụng công cụ tính trực tuyến: Tính tuổi trực tuyến.

Hướng dẫn liên quan

Câu hỏi thường gặp

Tại sao YEAR(hôm nay) trừ YEAR(dob) sai?

Nó bỏ qua việc năm nay sinh nhật đã diễn ra chưa, do đó, nó phóng đại tuổi trước ngày sinh nhật.

Loại SQL nào an toàn nhất cho ngày sinh?

Sử dụng cột ngày (không phải ngày giờ) cho DOB nếu bạn chỉ quan tâm đến ngày theo lịch.