Excel の DATEDIF関数

ちょっと必要があって、誕生日を割り出す計算式を探してみた。
ざっくりと計算するという前提なら、いいものを見つけた♪


年齢の計算 | Puppyのパソコンさぽーと - 楽天ブログ


ここで、Excle に datedif という関数があるのを初めて知った。
へ〜。


=DATEDIF(生年月日or配属日,終了日or今日の日付,"単位")
単位は Y,M,D とのこと。
また、確認したら生年月日はシリアル値*1じゃないとダメなようだ。

  • サンプル

=DATEDIF(DATE(YYYY,MM,DD),TODAY(),"Y")
これだと、DATEに指定した日付が何年前なのかが分かる。
Y が M だったら、何ヶ月前なのか。
Y が D だったら、何日前なのか。


あと…多分見解の相違だろうけど
=INT( YEAR(TODAY())&IF(MONTH(TODAY())>9,MONTH(TODAY()),"0"&MONTH(TODAY()))&IF(DAY(TODAY())>9,DAY(TODAY()),"0"&DAY(TODAY())))
という長い関数が気になった。


やりたいことはわかる。
今日の日付(シリアル値)から年を表示し、もし今日の月が9より大きい値だったらそのまま、違ったら値に0をつけた値を続けて表示し、もし今日の日付が9より大きい値だったらそのまま、違ったら0をつけた値を続けて表示したもの(文字列)を数値に変換して表示。


僕ならこうする…かな?
=INT(YEAR(TODAY())&TEXT(MONTH(TODAY()),"00")&TEXT(DAY(TODAY()),"00"))
今日の日付(シリアル値)から年を表示し、今日の月を表示形式"00"で続けて表示し、今日の日を表示形式"00"で続けて表示したもの(文字列)を数値に変換して表示。


あとは INT じゃなくて VALUE を使うとか。
INT = 指定した数値を超えない最大の整数を返す。
VALUE = 文字列として入力されている数字を数値に変換した結果を返す。
…多分、関数を短くしようとして INT を使ってるんだろうと思った。
=(YEAR(TODAY())&TEXT(MONTH(TODAY()),"00")&TEXT(DAY(TODAY()),"00"))*1
でも、同じ結果になるから。


他にも方法はあるだろうね〜


そうそう、その元ネタになってた計算式がこれ。
誕生日=(YYYYMMDD-YYYYMMDD)/10000
現在日時から誕生日を引いて10000で割り、小数点を切り捨てる。


Excel で入力するなら、今日の日付から引く場合…
=ROUNDDOWN((20090930-YYYYMMDD)/10000,0)
となるかな。
YYYYMMDDには、引きたい日付を入れれば良い。


誕生日の割り出し方はいくつか定義があるみたいで、簡単にコレでOKとはいえないみたい。
年金とか学校で使う年齢は、誕生日の前日に1歳加える…とか。


4月1日が誕生日の人は、3月31日に年齢が増える。
だから 4月2日に一人目を産んで、そのまま次の子を翌年4月1日に産んだ場合は、同じ学年となる。
ってこれはあんまり関係ないか。


前日に年を取るって…要はクリスマス・イヴみたいな概念なんかな?
と思って wikipedia を見てみる。
クリスマス・イヴ - Wikipedia
へぇ…イブが表してるのは前日じゃなくて当日の始まり(夕暮れ?)なのか。


なんていうか、考えることが複雑になってきそうで、知識として脳裏に蓄えておくだけ蓄えておいて…イヴのことは、この辺で考えるのをやめた(^_^;


うるう年の3月1日に生まれた人は、4年に一度しか誕生日を迎えない…なんてことはなくて、前日ということなので2月28日か2月29日に年齢が加算されるってことか。
2月29日が誕生日の人は、普通に2月28日に加算…と。


…ホント、日付や時刻にかかわる問題って頭が痛くなる。


でも、ざっくりと割り出すならコレでいけそうだ。
特殊な処理があるということさえ気をつけていれば電卓で計算できるんだから便利だよね〜

*1:シリアル値とは、Excel 内部で利用される日時を示す数値。1900年1月1日を基点として、1日ごとに1ずつ増える。シリアル値が2なら1900年1月2日。1時間は1を24で割った小数点以下の値。1分は1を24で割って60で割った小数点以下の値。40086.4715277778 だと 2009年9月30日 11時19分になる。