会社で働いていると、人の年齢を計算しないといけない局面というのが間々ありますね。人事担当の方は勿論でしょうけれども、営業をやっていても顧客管理というのもあります。今日、まさにそういう場面が訪れたのです。○月×日時点で雇用されている社員の平均年齢を出してくれ!
いやぁ、久し振りでしたね、こういうのは。かつて顧客管理データベースを作ったことがあるのですが、年齢計算というのは面倒ですね。単純に今の西暦から生年を引くわけにはいきません。誕生日が来ている人と来ていない人とでは変わるからですね。では、実際、どういう計算式で表現するか? もし誕生日が来ていれば、そうでない場合は、なんてIF文を使ったのではやたらとややこしくなります。ややこしい計算式を書いてしまうと、間違えた時に直すのも面倒です。
多分、私がかつて書いたのはこんな感じのものだったのでないかと思います。
=(現在の年月日−生年月日)*4/(365*4+1)
これは、誕生日までの日数を年で割るのですが、4年に1回閏年があるので、4年の日数で割って、その分分子に4を掛けてあるのですね。まぁ、誰でも考えつきそうな、最も基本的な、真面目な式と言えますが、あまりかっこよくないですね。
こういうものは表計算ソフトのエクセルでやることが多いと思いますが、エクセルは関数が充実しているので、便利な関数はないかと思って調べたら、ありました! DATEDIFというやつです。
=DATEDIF(生年月日,現在の年月日,"Y")
私は最初これを "dated if" と読んで何のこっちゃ、と思ってしまいましたが、"date difference" のことですね。最初の日付と2番目の日付がどれだけ離れているかを計算するもので、最後の"Y"のところで「満」になった単位を示します。例えば"Y"ならば満何年(何歳)という結果が得られ、"YM"とすると、満何ヶ月という結果が出てきます。よく勤務年数や居住年数で「何年何ヶ月」という表現がありますが、ああいう場面で便利ですね。うん、これは使える。
でも、必ずしもエクセルを使ってるとは限りません。他のデータベースソフトだったり、いや、出先で、パッと電卓かなにかで計算しないといけない時もあるかもしれません。
今回、どういう式を設定するのが一番いいか、試しにググってみたところ、佐野裕さんのブログに「生年月日から年齢を計算する簡単な計算式」なるものが出ていて、これには目から鱗でした。
=(現在の年月日−生年月日)/10000 (小数点以下切り捨て)
な、なぬっ! 閏年も複雑なかけ算や割り算も、IFも何もないぞ! 殆ど、ただ引いているだけではないか! 勿論、これらの年月日は"20070906"の形式にして計算するのですがね。試しに、1970年9月11日生まれの人の年齢を計算してみると
20070906 - 19700911 / 10000 = 36.9995
小数点以下切り捨てで見事36歳が得られました! 何でこうなるの? と思って、二つの数字を筆算風に縦に並べてじ〜っと睨んでいてわかりました。
20070906
19700911
そっか! 下4桁が誕生日の数字に達するかどうかだけが問題なんで、途中に閏年があるかないかなんて、全然関係なかったんですね!
勿論、この「簡単な計算式」を含め、ここで紹介したDATEDIFなど、全てそうなのですが、他のブログでも指摘されているように、これはあくまでも一般的に考えられているように、誕生日をもって年齢が増える、という解釈に基づく計算であって、実際の法律では、年齢の数え方がいろいろあるようで、法律によっても異なるようですので、実際に1日の違いがクリティカルな局面では、その場合場合に合わせて上記の式を変形することが必要でしょう。
それにしても、シンプルな式というのは気持ちがいいものですね。高校生の頃、よく矢野健太郎先生の数学エッセイを読んだものですが、矢野先生はよく「エレガントな解答」ということを書いておられました。正しい答を出す方法は、実はいくらでもある、だけれども、ゴタゴタした式や証明よりもすっきりと短いものの方が素晴らしい、それを先生は「エレガントな解答」と呼んだのでした。
矢野先生の影響があるのか、自分でもプログラムを書いていく時には、できるだけスッキリしたものを書きたいと思っています。なかなか最初からそんなにかっこいいコーディングができないのですけれどね。それだけに——。
年齢計算は面倒、と思い込んでいただけに、「簡単な計算式」は久し振りに目から鱗が落ち、スカッとする経験をさせて頂きました。佐野さん、ありがとうございました。
Recent Comments