Date タイプの属性を含むテーブル A があります。Aの値の1か月後の値を持つ別のテーブルBの日付を選択するクエリを書きたいと思います.Oracleでそれを行う方法を知っている人はいますか?
3 に答える
ADD_MONTHSOracleで関数を使用する必要があります。
http://www.techonthenet.com/oracle/functions/add_months.php
追加情報:この関数を今日の日付で使用する場合はADD_MONTHS(SYSDATE, 1)、今から 1 か月後に使用できます。
問題は、テーブル b の date_field がテーブル a の date_field より 1 か月進んでいるテーブル b から date_field を選択することです。
質問で現在指定されていない追加の要件を考慮する必要があります。1 か月全体 (月の日付は考慮されません) に関心がありますか、それとも 1 か月先の日付を不適格とする可能性がある日を含める必要がありますか (例: a=2011-04-30 とb=2011-05-01、b は 1 か月先ですが、1 日しか進んでいません)。
最初のケースでは、両方の日付を年と月の値に切り詰める必要があります。
SELECT TRUNC( TO_DATE('2011-04-22','yyyy-mm-dd'), 'mm') as trunc_date
FROM dual;
与えます:
trunc_date
----------
2011-04-01
2 番目のケースでは、日付を変更する必要はありません。
最初の問題を解決するには、少なくとも 2 つの方法を使用できます。
最初の 1 つは、テーブル a の date_field に 1 か月を追加し、一致する日付を持つテーブル b の行を見つけることを中心に展開します。
SELECT b.date_field
FROM tab_a as a
,tab_b as b
WHERE ADD_MONTHS( TRUNC( a.date_field, 'mm' ), 1) = TRUNC( b.date_field, 'mm' )
;
切り捨てられた日付に注意してください。これを省略すると、日付間の完全な毎日の一致が必要になります。
2 番目のアプローチは、2 つの日付間の月の差を計算し、1 か月の差を与える計算を選択することに基づいています。
SELECT b.date_field
FROM tab_a as a
,tab_b as b
WHERE months_between( TRUNC( b.date_field, 'mm') , TRUNC(a.date_field, 'mm') ) = 1
ここでは、months_between のフィールドの順序が重要です。提供された例では:
- a.date_field の 1 か月前の b.date_field の場合、値は 1 です。
- a.date_field の 1 か月前の b.date_field の場合、値は -1 (マイナス 1) です。
順序を逆にすると、結果も逆になります。
これがあなたの質問に答えることを願っています。