HTML,CSS,Javascript,PHPを中心に、WEB制作時に忘れがちなTipsを紹介など。
「MySQL 年齢計算」なんかで検索すると謎の呪文が出てきます。
皆これを使えば年齢が出るよと。
(YEAR(CURDATE()) - YEAR(birthday)) - (RIGHT(CURDATE(), 5) < RIGHT(birthday, 5))
この呪文で年齢が出ます。なんで年齢が出るのか。
この式は大きく括ると「A-B」の左項と右項に別れる。まずは左項から。
( YEAR(CURDATE()) - YEAR(birthday) )
YEAR()関数は引数に与えられた日付の「年」の部分を返す。つまり、現在年月日 CURDATE()の年から生年月日の年を単純に引いたのが左項になる。
これだけで年齢返ってくるじゃん!と思いきや、現在年月日が誕生日に達していない場合は上記の結果から1年を引かなければならない。
そこで右項の登場。
(RIGHT(CURDATE(), 5) < RIGHT(birthday, 5))
RIGHT()関数は第一引数に与えられた文字列を第二引数で与えられた文字数分、右から切り出す。つまり、右項では現在年月日のしも5桁と生年月日の下5桁、どちらが大きいかを比較している。
この下5桁と言うのは「YYYY-MM-DD」で表される日付書式の月日の部分となる。
つまり、現在年月日が誕生日に達しているかどうかを判定している。
現在年月日が誕生日に達していた場合、右項は「FALSE」となる。
逆に達していない場合、右項は「TRUE」となる。
MYSQLにおいて、BOOLEAN型は内部的に0:偽、1:真となる(参考:Mysqlのboolean型について調べてみた)ため、上記は
と置き換えれる。
つまり、この呪文は「単純に年の差分を取得して、さらに誕生日に達していない場合は1を引く」という計算を表していることになる。
日付の計算というページに、「TIMESTAMPDIFF()」という関数で年齢が取得出来るよ的なことが書いてあります。(MySQLリファレンス::日付の計算)
TIMESTAMPDIFF(YEAR,birth,CURDATE())
タイムスタンプの差分の年の部分を取り出しますよ。って感じですね。
こっちの方がシンプルやなかですかっ!!
これがあまり使われないのには何か理由があったりするのでしょうか。
タイムスタンプの差分なので、うるう年が考慮されないとかそんなあたりかな・・・。
理由が知りたい。