Oracleで現在日から満年齢を計算する方法!

スポンサーリンク
060-SQL

へっぽこヘタレシステム管理者の管理人です。

先日からショボイシステムを作っていますが・・・

システムの現在日から満年齢を出す方法が分からず・・・

悪銭苦闘していたのですが、なんとか解決する方法が見つかったので、

忘備録として掲載しておきます。

まずは年齢の出し方

まずは年齢の出し方です。

Oracledでは【trunk】と【months_between】を使います。

例えば、次のSQLを入力して実行すれば

select
 trunc(months_between(sysdate,'生年月日')/12) as nenrei
from
 dual
;

生年月日から現在日の年齢が出せます。

満年齢の出し方

ただ、年齢を出すだけなら前述のSQLで良いのですが・・・

満年齢(学年)の基準は・・・

毎年4月2日から翌年の4月2日となります。

これは、学校教育における「年齢計算の基準日」としての法律的な根拠に基づいており、

具体的には、「年齢計算ニ関スル法律」という法律で、

誕生日の前日に年齢が加算されると定められている事が理由です。

この法律により、4月1日生まれの人は前日の3月31日に年を取ることになり、

事実上4月1日生まれの子供は前年の学年に属することになるわけです。

ということで、口で言うのは簡単なのですが、これを考慮して満年齢(学年)を出さないといけません。

スポンサーリンク

4月1日生まれを無視すれば?

例えば、

2024年3月31日生まれも2024年4月1日生まれも

2024年9月27日を現在日とすると1歳になり、

2024年4月1日生まれの場合は0歳にならないといけません。

4月1日が前の学年になるせいで、ここがややこしいんですよね。

細かい誤差(4月1日生まれ)を無視するのであれば次のSQLでよいのですが・・・

select
        case when to_char(sysdate,'MM') in ('01','02','03') then
                trunc(months_between(to_char(sysdate,'yyyy') || '0401','生年月日')/12)
        else
                trunc(months_between(to_char(sysdate,'yyyy') + 1 || '0401','生年月日')/12)
        end as 年齢

from
        dual
;

4月1日生まれの方の満年齢(学年)がズレるわけです。

4月1日生まれを無視しない方法は?

で、イロイロと悩んだ結果・・・・

年齢の算定には・・・

  • 生年月日
  • 計算を実行する日
  • 満年齢を計算する基準日

の3つが必要です。

年齢を計算する基準日については、計算する実行日によって、

スポンサーリンク

満年齢を計算する基準日の年に1を足すか足さないかが分かれてくるので・・・

要するに計算を実行する日が、

1月1日から4月1日までなら、

満年齢を計算する基準日の年に1を足さない。

ブログランキングにご協力ください!
ブログランキング・にほんブログ村へ

4月2日から12月31日までなら、

満年齢を計算する基準日の年に1を足せば良いわけです。

なんだかんだ思考した挙句ですが、

次のSQLでなんとかなりました。

select
        case when to_char(sysdate,'MM/DD') between '01/01' and '04/01' then
                trunc(months_between(to_char(sysdate,'yyyy') || '0401','生年月日')/12)
        else
                trunc(months_between(to_char(sysdate,'yyyy') + 1 || '0401','生年月日')/12)
        end as 年齢

from
        dual
;

ショボイシステムとはいえ・・・

少なからず4月1日生まれの方もいらっしゃるので・・・

ここを無視するわけには行きません。

例えば、給付金の算定の実行日を4月1日にした場合には、

生年月日が4月1日だと本来の算定基準からハズれる可能性があるわけですね。

危険です。

不定期に実行しないシステムなら良いのですが・・・

窓口で使うシステムのため、4月1日にも実行する可能性はかなり高い。

そうなると、この誤差を放置しておくわけには行かなくなるわけです。

面倒くさい話です。

ブログ開設に必要なドメイン取得、サーバーレンタル、ASPの登録等は、こちらのサイトから!

コメント

タイトルとURLをコピーしました