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ầ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àykhi 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.