2011-04-17 53 views
0

我有一個包含日期類型屬性的表A.我想編寫一個查詢來選擇另一個表B中的值,並在A值中的一個月後選擇值。任何人都知道如何在oracle中執行該操作?添加一個月到保存日期(oracle)

+3

你如何定義「一個月」?即如果源日期是1月31日,目標日期是多少? 2月28日或29日?三月的某一天? – Mat 2011-04-17 07:53:02

+0

3月的第一個日期,恰好在31日之後的一個月。 – SunyGirl 2011-04-17 07:55:58

+0

遊行的第一次約會並不真正。這是前兩個「月」,或者是29或30天。 – Mat 2011-04-17 08:00:19

回答

8

呃... ...這是第一次打在谷歌:

http://psoug.org/reference/date_func.html

看來你要尋找的 「ADD_MONTHS」 功能。

+0

不,我看到它,系統日期不是保存日期在表中。 – SunyGirl 2011-04-17 08:01:44

+6

@ user623906:你錯了,你可以在任何日期使用它。 – Mat 2011-04-17 08:02:19

2

問題是從表b中選擇一個date_field,其中表b的date_field比表a中的date_field提前一個月。

此問題中還必須考慮一個當前未指定的附加要求。我們是否對整個月(不考慮月份中的某幾天)感興趣,或者我們是否希望包括可能會使得提前一個月但只有幾天的日期不合格的日子(例如: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 

在第二種情況下,我們不必修改日期。

至少有兩種方法可用於解決最初的問題:

首先一個旋轉約一個月加入表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') 
    ; 

請注意截斷的日期。離開這個需要日期之間完美的日常匹配。

第二種方法是基於計算兩個日期之間的月差並選擇給出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_field1個月提前 a.date_field的值是1
  • 爲b.date_field1個月之前a.date_field值爲-1(負一個)

顛倒順序也將扭轉結果。

希望這回答你的問題。