YamasakiMasaki.com
  • ホームHome
  • ヤマサキマサキ / やまCh.YouTube
  • 外部記憶装置Blog
  • 制作支援ツールTools
  • ツイッターTwitter
  • メガネカケル-○○-×○
外部記憶装置
2021.03.12

MySQLで生年月日から年齢を計算する方法[再掲]

MySQL 年齢計算 謎
この記事をシェア

謎の呪文をよく目にするのです。

「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型について調べてみた)ため、上記は

 

  • 現在年月日が誕生日に達していた場合、右項は「0」
  • 逆に達していない場合、右項は「1」

 

と置き換えれる。

 

つまり、この呪文は「単純に年の差分を取得して、さらに誕生日に達していない場合は1を引く」という計算を表していることになる。

 

ちなみにMySQLのマニュアルでは…

日付の計算というページに、「TIMESTAMPDIFF()」という関数で年齢が取得出来るよ的なことが書いてあります。(MySQLリファレンス::日付の計算)

TIMESTAMPDIFF(YEAR,birth,CURDATE())

タイムスタンプの差分の年の部分を取り出しますよ。って感じですね。
こっちの方がシンプルやなかですかっ!!

これがあまり使われないのには何か理由があったりするのでしょうか。
タイムスタンプの差分なので、うるう年が考慮されないとかそんなあたりかな・・・。
理由が知りたい。

 

 

 

この記事をシェア
エクセルマクロでセルピッタリに画像を挿入する方法[再掲]
一覧に戻る
いろんなサービスのブランドロゴをSVGで配布しているサイトをみつけた。
ヤマサキマサキ
1985年・大阪生まれ大阪育ち。IT業界で主にWEBシステムだったりWEBサイトだったりを作って生きてます。お問い合わせなどはTwitterにてお願いします。
ヤマサキマサキ / やまch. @_Ya_Masaki_ SUZURI 「メガネカケル」
© YamasakiMasaki