dポイントプレゼントキャンペーン実施中!

テーブル(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. …を参考にして
やるか、またはSUBSTRで行う方法をイメージしています。
出来れば1回で実行したいので、SUBSTRは向いていないのかなぁっと思っています。

A 回答 (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.生年月日
;

な感じじゃないかと想像しますが。
    • good
    • 0
この回答へのお礼

メッセージありがとうございます。

教えて頂いたやり方で無事出来るようになりました。

ありがとうございました。
もうちょと詳しくSQLを解読して見たいと思います。

お礼日時:2008/10/14 20:46

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
;

この回答への補足

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にしようかと思います。

もしよければアドバイスなど
よろしくお願い致します。

補足日時:2008/10/06 23:07
    • good
    • 0
この回答へのお礼

メッセージありがとうございます。

質問で細かく書いていないので
申し訳ないのですが、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 = '取得したパラメータ'として
出来ればいいのですが。

環境がないので今は試せないのですが
参考にさせて頂き出来たら御礼をさせて頂きます。

お礼日時:2008/10/04 17:25

きれいかどうかは別ですが


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

この回答への補足

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の処理を書こうかと思います。

もしよければ何かアドバイスがあれば
よろしくお願いいたします。

補足日時:2008/10/06 22:59
    • good
    • 0
この回答へのお礼

メッセージありがとうございます。

ちょと今試す事が出来ないのですが
参考にさせて頂き、お礼をさせて頂きます。

お礼日時:2008/10/04 17:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!