2011-04-17 9 views
0

私は、日付タイプ属性を含むテーブルAを持っています。私は、Aの値の1ヶ月後に値を持つ別のテーブルBに日付を選択するためのクエリを作成したいと思います。誰かがOracleでそれを行う方法を知っていますか?保存日(オラクル)に1ヶ月追加

+3

どのように「1か月」を定義しますか?つまり、ソース日付が1月31日の場合、ターゲット日付は何ですか? 2月28日か29日? 3月のある日? – Mat

+0

3月の最初の日付。31日後の1ヶ月です。 – SunyGirl

+0

行進の最初の日は本当に感動しません。これは2カ月前または29日後または30日前です。 – Mat

答えて

8

オム...これは、Googleの最初のヒットでした。

+0

いいえ、私はそれを見ました、それはシステムの日付のためのテーブルの保存日ではないです。 – SunyGirl

+6

@ user623906:あなたは間違っていますが、それはどの日付でも使用できます。 – Mat

2

質問は、テーブルbのdate_fieldがテーブルaのdate_fieldより1ヶ月先のテーブルbからdate_fieldを選択することです。

現在のところ、この質問では特定されていない追加の要件を考慮する必要があります。 1か月先の日付を2日後に失効させる可能性のある日数を含めるかどうか(例: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; 

が与える:第2のケースで

trunc_date 
    ---------- 
    2011-04-01 

我々は、日付を変更する必要はありません。

少なくとも二つのアプローチは、最初の問題を解決するために使用することができる

最初のものは周りの表AにDATE_FIELDに一ヶ月を追加し、一致する日付が表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のフィールドの順序が重要です。 b.date_field一ヶ月ため

  • 前方 a.date_fieldの値が値a.date_field一ヶ月前b.date_field 1
  • である-1(ネガティブ:提供される例で1)

注文を元に戻すと、結果が逆転します。

これはあなたの質問にお答えします。

関連する問題