• ベストアンサー

生年月日計算について

テーブル(A)     テーブル(B) ID --- 111      ID ---111 生年月日 --- 2007/02/18    日付 --2008/10/3 テーブル(A)には、ID、生年月日があります。 テーブル(B)には、ID、日付があります。 テーブル(A)の生年月日とテーブル(B)の日付を計算し 表示したいと考えていますが、うまく行きません…。 やりたい事としては、テーブル(B)の値とテーブル(A)の値を計算し 2008 - 2007 = 1なので1才と表示し、 10 - 02 = 8なので、8ヶ月と表示したいと考えています。 やり方として一番どのようなやり方が キレイなSQLを書けるのでしょうか? 一応http://ayuayuayu01.seesaa.net/article/106439889.htmlを参考にして やるか、またはSUBSTRで行う方法をイメージしています。 出来れば1回で実行したいので、SUBSTRは向いていないのかなぁっと思っています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

実態に則さないサンプルを示すと、こういった問題が起こります。 select trunc( months_between( to_date(max(b.日付),'yyyy/mm/dd'), to_date(a.生年月日,'yyyy/mm/dd') ) / 12 ) 年齢, trunc( mod( months_between( to_date(max(b.日付),'yyyy/mm/dd'), to_date(a.生年月日,'yyyy/mm/dd') ),12 ) ) 月 from a inner join b on a.id=b.id group by a.id,a.生年月日 ; な感じじゃないかと想像しますが。

NeilMania
質問者

お礼

メッセージありがとうございます。 教えて頂いたやり方で無事出来るようになりました。 ありがとうございました。 もうちょと詳しくSQLを解読して見たいと思います。

その他の回答 (2)

回答No.2

mod関数を使って、ちょっとだけスマートに。 select trunc( months_between( to_date(b.日付,'yyyy/mm/dd'), to_date(a.日付,'yyyy/mm/dd') ) / 12 ) 年齢, trunc( mod( months_between( to_date(b.日付,'yyyy/mm/dd'), to_date(a.日付,'yyyy/mm/dd') ),12 ) ) 月 from a inner join b on a.id=b.id ;

NeilMania
質問者

お礼

メッセージありがとうございます。 質問で細かく書いていないので 申し訳ないのですが、ASP.NETにて開発をしており 別の画面からIDを取得し、その取得したIDを元に A,Bテーブルから取得する処理を行います。 Bテーブルから取得する日付は IDに対する最大値を取得する事になります。 B(テーブル) ID 日付 111 2008/10/03 111 2008/10/04 などの場合、2008/10/04を取得するため MAX(日付)などが必要になり、また別の画面から取得した IDを元に各テーブルから取得をするため inner joinが使えないかも?しれません。 一度結合をし、WHERE ID = '取得したパラメータ'として 出来ればいいのですが。 環境がないので今は試せないのですが 参考にさせて頂き出来たら御礼をさせて頂きます。

NeilMania
質問者

補足

Bテーブルの日付をMAXとして取得処理を行わないと いけないため、ちょとSQLが自分ではわからなかったので Viewを作成し、Aテーブル、Bテーブルの結合を行いました。 SELECT TRUNC( MONTHS_BETWEEN( TO_DATE(MAX(生年月日),'YYYY/MM/DD'), TO_DATE(日付,'YYYY/MM/DD') ) / 12 ) 年齢, TRUNC( MOD( TO_DATE(MAX(生年月日),'YYYY/MM/DD'), TO_DATE(日付,'YYYY/MM/DD') )*12 ) ) 月 from VIEW_A; 今現在SQLでエラーになって原因が わかりませんが、このようなSQLにしようかと思います。 もしよければアドバイスなど よろしくお願い致します。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

きれいかどうかは別ですが select trunc( months_between( to_date(b.日付,'yyyy/mm/dd'), to_date(a.日付,'yyyy/mm/dd') ) / 12 ) 年齢, trunc( months_between( to_date(b.日付,'yyyy/mm/dd'), to_date(a.日付,'yyyy/mm/dd') ) )- trunc( months_between( to_date(b.日付,'yyyy/mm/dd'), to_date(a.日付,'yyyy/mm/dd') ) /12 ) * 12 月 from a inner join b on a.id=b.id

NeilMania
質問者

お礼

メッセージありがとうございます。 ちょと今試す事が出来ないのですが 参考にさせて頂き、お礼をさせて頂きます。

NeilMania
質問者

補足

Bテーブルの場合、MAX(日付)として 最大値を取得しなければいけないため 普通にSQLだと厳しいかと思い Viewを使用し、AテーブルとBテーブルを結合しました。 SELECT TRUNC( MONTHS_BETWEEN( TO_DATE(生年月日,'YYYY/MM/DD'), TO_DATE(MAX(日付),'YYYY/MM/DD') ) / 12 ) 才, TRUNC( MONTHS_BETWEEN( TO_DATE(生年月日,'YYYY/MM/DD'), TO_DATE(MAX(日付),'YYYY/MM/DD')) )- TRUNC( MONTHS_BETWEEN( to_date(MAX(日付)'YYYY/MM/DD'), to_date(生年月日,'YYYY/MM/DD') ) /12 ) * 12 月 FROM VIEW_A; 今現在エラーが出ていて理由がわかりませんが こんな感じでSQLの処理を書こうかと思います。 もしよければ何かアドバイスがあれば よろしくお願いいたします。

関連するQ&A