• 2 min read
SQL で年齢を計算する方法 (PostgreSQL、MySQL、SQL Server)
生年月日から年齢を計算するための実用的な SQL パターンを学びます。完済年数、正確な年と月、特定の日の年齢です。 PostgreSQL、MySQL、SQL Server の例が含まれています。
生年月日からSQLで年齢を計算する必要がありますか?このガイドでは、一般的なデータベースに対する実用的なコピー準備完了クエリを示します。次の計算方法を学びます:
- 年齢(完遂年数)
- 特定の日付時点の年齢(今日だけではありません)
- 詳細が必要な場合の正確なスタイル出力 (年と月)
1) ユースケースにとって「年齢」が何を意味するかを決定する
ほとんどのビジネス ロジックでは、完了年数を使用します。つまり、2000 年 6 月 10 日に生まれた人は、それ以前ではなく、2026 年 6 月 10 日に 25 歳になります。 YEAR(今日) - YEAR(生年月日) のような単純な年の引き算は、誕生日の前では間違っているため注意してください。
2) PostgreSQL: 経過年数 (完了年数)
PostgreSQL には、間隔を返す age() 関数が組み込まれています。次のように完全な年を抽出します:
SELECT EXTRACT(年齢(CURRENT_DATE, 生年月日)からの年) 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, 生年月日, DATE('2026-02-23')) AS age_years
人々から;
4) SQL Server: 経過年数 (完了年数)
SQL Server の一般的なパターンは、DATEDIFF から誕生日のチェックを引いたものです:
SELECT
DATEDIFF(年, 日付, CAST(GETDATE() AS 日付))
- ケース
WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, CAST(GETDATE() AS date)), dob) > CAST(GETDATE() AS date)
その後 1 その他 0
age_year までに終了
人々から;
SQL Server: 特定の日付時点での有効期限
@as_of date = '2026-02-23'; を宣言してください。
選択
DATEDIFF(年、生年月日、@as_of)
- ケース
WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, @as_of), dob) > @as_of
その後 1 その他 0
age_year までに終了
人々から;
5) 正確な年齢 (年と月) の例
「31 歳 4 か月」のような「正確な」表現が必要な場合は、最初に年を計算し、次に最後の誕生日からの月数を計算します。 PostgreSQL の例を次に示します:
ベース AS 付き (
SELECT データベース、CURRENT_DATE AS as_of
人々から
)
選択
EXTRACT(YEAR FROM age(as_of, dob)) AS 年、
EXTRACT(MONTH FROM age(as_of, dob)) AS 月
ベースから;
よくある落とし穴
- タイムゾーン: 可能な場合は生年月日を
日付として保存します。日時はゾーン間で変わる可能性があります。 - 閏日の誕生日: 閏年以外の日に何が起こるかを定義します。ほとんどのシステムは、ポリシーに応じて、2004 年 2 月 29 日の誕生日を 02 月 28 日または 03 月 1 日として扱います。
- Null または将来の DOB: フィルタまたはガード、それ以外の場合クエリは null または負の値を返します。
簡単な健全性チェック
単一の生年月日をすぐに確認したい場合は、オンライン計算機を使用できます: オンラインで年齢を計算する。
関連ガイド
よくある質問
YEAR(今日) から YEAR(生年月日) を引くのはなぜ間違っていますか?
今年の誕生日がまだあるかどうかは無視されるため、誕生日前の年齢が誇張されています。
生年月日の最も安全な SQL タイプは何ですか?
暦日のみを考慮する場合は、DOB に 日付 列(日時ではない)を使用します。