2013/07/20

年齢計算

普段は PostgreSQL を使っています。自前のアプリケーション「個人データ管理システム Zebra 」でも使用しています。で、よく年齢計算なんかをしたりします。

通常は、何歳ということで「年」だけを取ってくればいいのですが、よくばって「月」まで計算しようとしています。PostgreSQL の場合は以下。

年をとるには
select extract(year from age(now(), '1960-8-22'))
月をとるには
select extract(month from age(now(), '1960-8-22'))

と、PostgreSQL の age() 関数にバリバリ、頼っているわけです。

で、ここからが本題。SQLite3 だったらどうしよう。


残念ながら age() 関数はありません。できることなら SQL 文一発で解決したいものです。そこで次のような SQL 文をいろいろググりながら作り上げました。

SELECT
  ((strftime('%Y%m%d', 'now')-strftime('%Y%m%d', birthday))/10000) AS Age,
  case
    when (strftime('%m', 'now') - strftime('%m', birthday)) < 0 then 12 + (strftime('%m', 'now') -   strftime('%m', birthday))
    else (strftime('%m', 'now') - strftime('%m', birthday))
  end as Month
from
  members

ちょっと「月」の部分の出方が違っていますが、解釈の違いということで。