返回博客
2 min read

如何在 SQL 中计算年龄(PostgreSQL、MySQL、SQL Server)

学习实用的 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 类型是什么?

如果您只关心日历日,请使用日期列(而不是日期时间)作为出生日期。