* 年齢計算について [#x91a6ee5]
 -ページ:[[FrontPage]]
 -投稿者: とうさん
 -分類: Q&A
 -優先順位: 普通
 -状態: 完了
 -カテゴリー: Base データベース
 -投稿日: 2006-09-15 22:59:25 (金)
 -OS: Windows XP
 -バージョン: 2.0.3
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#b03b8d0b]
 #contents
 
 テーブルで作成した生年月日のフィールドを利用して~
 年齢の計算は出来るのでしょうか?~
 Accessでは出来るのですがBaseでのやり方が分かりません。~
 よろしくお願いします。~
 #clear
 
 ----
 ***年の引き算でよいのであれば [#q5764f62]
 >M.Kamataki (2006-09-15 23:27:21 (金))~
 ~
 「日付データをもとに誕生月で抽出するクエリーを作成したい」(faq/3/345)で紹介したEXTRACT関数を用いれば、生年月日から生まれ年を取り出せるので、年の引き算は可能です。~
 ~
 ただ、「Accessで出来る」というものが、どういうものなのかわからないので、はずしているかもしれません。できれば、「Accessで出来る」という方法もご紹介ください。~
 
 //
 ***無題 [#e4473c08]
 >とうさん (2006-09-15 23:43:26 (金))~
 ~
 早速の回答ありがとうございます。~
 Accsessではクエリーで年齢のフィールドを作り~
 「Int(DateDiff(”d”,[誕生日],Now())/365.25)」の関数を使い~
 年齢を出しておりました。~
 ~
 BaseではEXTRACT関数を使い「誕生日」から生まれ年をを取り出し~
 現在の年を引き年齢を割り出すという考えでよろしいのでしょうか?~
 早速試してみたいと思います。~
 
 //
 ***無題 [#vc652d30]
 >とうさん (2006-09-16 00:25:44 (土))~
 ~
 「YEAR( NOW( ) ) - EXTRACT( 'YEAR' FROM "誕生日" )」のフィールドを作り年齢は出たのですが、~
 誕生日前後で年齢が変わる式は出来ないものでしょうか?~
 色々試しているのですがうまく出来ません。~
 よろしくお願いいたします。~
 
 //
 ***できました [#w9c6ba45]
 >M.Kamataki (2006-09-17 11:19:35 (日))~
 ~
 Accessの例を上げていただいたので、なんとかできることが確認できました。~
 ~
 DATEDIFF関数は、調べてみるとHSQLDBにも備わっていました。また、丸め処理はROUND関数が使えます。これらの関数は、HSQLDBの公式サイトにある以下のドキュメントで確認できます。~
 http://hsqldb.org/doc/guide/ch09.html~
 ~
 AccessでのSQL文~
  Int(DateDiff(”d”,[誕生日],Now())/365.25)
 は、Baseでは以下のように書き換えられます。~
  ROUND( DATEDIFF( 'dd', "誕生日", CURRENT_TIMESTAMP ) / 365.25, 0 ) - 1
 ~
 クエリーのデザイン表示では、以下のように実行できました。このクエリーを保存すれば良いと思います。~
 ~
 &attachref(faq3_352_01.png,nolink);~
 
 //
 ***出来ました! [#g8532b52]
 >とうさん (2006-09-17 17:58:20 (日))~
 ~
 なんとか出来ました。~
 色々調べていただきありがとうございます。~
 この質問については完了にしてください。~
 また何かあったら質問させていただきたいと思います。~
 ありがとうございました。~
 
 //
 ***ごめんなさい [#of0bc1bb]
 >M.Kamataki (2006-09-18 11:46:34 (月))~
 ~
 昨日、出掛けに書いたもので、検証が不十分でした。ROUND関数は、値を四捨五入するので、たとえば現在の日付から6ヶ月未満に生まれた方の満年齢が1年少なくなってしまいます。小数点の切捨てができる関数を調べたところ、HSQLDBにはFLOOR関数が備わっていることがわかりました。したがって、満年齢計算のSQL文は以下のようになります。~
  FLOOR( DATEDIFF( 'dd', "誕生日", CURRENT_TIMESTAMP ) / 365.25 )
 ~
 とうさんが確認いただければ、当質問は完了にします。~
 
 //
 ***ありがとうございます [#zaad4793]
 >とうさん (2006-09-19 00:45:10 (火))~
 ~
 色んな生年月日をこの関数により検証してみました。~
 結果、正常に表示されます。~
 ~
 これを機にSQLについて少し勉強してみようと思います。~
 また疑問が出てきましたら質問したいと思います。よろしくお願いします。~
 ありがとうございました。~
 
 //
 ***完了にします [#r3153b65]
 >M.Kamataki (2006-09-19 11:16:13 (火))~
 ~
 どうも調査不足でお手間をおかけしたようです。すみません。ご確認いただけたようなので、完了にします。~
 ~
 当ページの年齢計算は、うるう年を考慮して365.25で割っていますが、計算日と誕生日の比較処理で満年齢を計算する方法のほうが正確です。しかし、わたしが試したところ、BaseではCASE文を使った比較処理の部分がうまくいっていません。こちらは今後の課題にしたいと思います。~
 
 //
 ***計算日と誕生日の比較処理で満年齢を計算する方法 [#hb097622]
 >M.Kamataki (2006-09-29 00:20:12 (金))~
 ~
 Accessでは、~
  年齢:IIf(Format([生年月日],"mm/dd")>Format(Date(),"mm/dd"),
  DateDiff("yyyy",[生年月日],Date())-1,
  DateDiff("yyyy",[生年月日],Date()))
 として、計算日と誕生日を比較して満年齢を計算するSQL文が、以下のサイトなどで紹介されています。~
 ~
 「年齢計算をしたい−DateDiff関数・IIf関数」~
 http://www.relief.jp/itnote/archives/000731.php~
 ~
 同じようにBaseでできるのか試行錯誤したところ以下の図のようなSQL文で実現可能でした。ご報告します。なお、このクエリーは[SQLコマンドを直接実行]ボタンを押下状態にしておかないとエラーになります。~
 ~
 &attachref(faq3_352_02.png,nolink);~
 
 //
 ***お役所向けの年齢計算 [#u85d1fee]
 >M.Kamataki (2006-09-29 10:57:21 (金))~
 ~
 調べてみると、一般的な年齢計算と民法に定められた「誕生日の前日に加齢する」を前提にした計算があるようです。この場合は、下図のようになります。お役所などでは、こちらを使ったほうが良いのでしょうね。有名なのは、4月1日生まれのため、小学校へ1年入学が早まる、などの例です。~
 ~
 &attachref(faq3_352_03.png,nolink);~
 ~
 参考:~
 「誕生日から年齢を算出する」~
 http://biz.rivus.jp/functions/years_of_age.html~
 
 //
 #article
 //#comment