へっぽこヘタレシステム管理者の管理人です。
先日からショボイシステムを作っていますが・・・
システムの現在日から満年齢を出す方法が分からず・・・
悪銭苦闘していたのですが、なんとか解決する方法が見つかったので、
忘備録として掲載しておきます。
まずは年齢の出し方
まずは年齢の出し方です。
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日にも実行する可能性はかなり高い。
そうなると、この誤差を放置しておくわけには行かなくなるわけです。
面倒くさい話です。
コメント