• 2 min read
如何在 SQL 中计算年龄(PostgreSQL、MySQL、SQL Server)
学习实用的 SQL 模式来计算从出生日期开始的年龄:完成年份、确切年份和月份以及截至特定日期的年龄。包括 PostgreSQL、MySQL 和 SQL Server 的示例。
需要在 SQL中根据出生日期计算年龄?本指南展示了常见数据库的实用、可复制的查询。您将学习如何计算:
- 年龄(完成年数)
- 截至特定日期(不仅仅是今天)的年龄
- 当您需要更多详细信息时,精确的样式输出(年份和月份)
1) 确定“年龄”对于您的用例意味着什么
大多数业务逻辑使用年完成。这意味着 2000 年 6 月 10 日出生的人在 2026 年 6 月 10 日就满 25 岁了,而不是更早的时间。请小心使用简单的年份减法,例如 YEAR(today) - YEAR(dob),因为在生日之前是错误的。
2) PostgreSQL:年龄(完成年数)
PostgreSQL 有一个内置的 age() 函数,该函数返回一个区间。像这样提取完整年份:
SELECT EXTRACT(YEAR FROM Age(CURRENT_DATE, dob)) AS Age_years
来自人;
PostgreSQL:截至特定日期的年龄
SELECT EXTRACT(YEAR FROM Age(DATE '2026-02-23', dob)) AS Age_years
来自人;
3) MySQL:年龄(完成年数)
在 MySQL 中,使用 TIMESTAMPDIFF:
SELECT TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS Age_years
来自人;
MySQL:截至特定日期的年龄
SELECT TIMESTAMPDIFF(YEAR, dob, DATE('2026-02-23')) AS Age_years
来自人;
4) SQL Server:年龄(完成年数)
SQL Server 中的常见模式是 DATEDIFF 减去生日检查:
选择
DATEDIFF(年份、出生日期、CAST(GETDATE() AS 日期))
- 案例
WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, CAST(GETDATE() AS date)), dob) > CAST(GETDATE() AS date)
然后 1 其他 0
END AS 年龄
来自人;
SQL Server:截至特定日期的年龄
声明@as_of日期='2026-02-23';
选择
DATEDIFF(年份,出生日期,@as_of)
- 案例
WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, @as_of), dob) > @as_of
然后 1 其他 0
END AS 年龄
来自人;
5) 确切年龄(年和月)示例
如果您想要“精确”的表示形式,例如“31 年零 4 个月”,请先计算年份,然后计算上次生日之后的月份。这是一个 PostgreSQL 示例:
带有基础 AS (
选择 dob,CURRENT_DATE AS as_of
来自人
)
选择
提取(年份来自年龄(as_of,dob))AS年,
EXTRACT(MONTH FROM Age(as_of, dob)) AS 月份
来自基础;
常见陷阱
- 时区:如果可能,将 DOB 存储为
日期。日期时间可以跨区域移动。 - 闰日生日:定义非闰年发生的情况。大多数系统将 2004-02-29 生日视为 02-28 或 03-01,具体取决于政策。
- 空或未来的 DOB:过滤器或保护,否则您的查询将返回空值或负值。
快速健全性检查
如果您想快速验证单个出生日期,可以使用在线计算器:在线计算年龄。
相关指南
常见问题解答
为什么 YEAR(today) 减去 YEAR(dob) 是错误的?
它忽略了今年是否已经过生日,因此夸大了生日之前的年龄。
出生日期最安全的 SQL 类型是什么?
如果您只关心日历日,请使用日期列(而不是日期时间)作为出生日期。