添加一个月到保存日期(oracle)

时间:2011-04-17 07:49:39

标签: oracle date-arithmetic

我有一个包含Date类型属性的表A.我想编写一个查询来选择另一个表B中的日期,其值在A.Any中的值一个月之后,知道如何在oracle中执行此操作?

3 个答案:

答案 0 :(得分:8)

嗯......这是谷歌的第一个热门话题:

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

看来你正在寻找“add_months”功能。

答案 1 :(得分:6)

您需要使用Oracle中的ADD_MONTHS函数。

http://www.techonthenet.com/oracle/functions/add_months.php

其他信息:如果您想在今天的日期使用此功能,可以使用ADD_MONTHS(SYSDATE, 1)从现在开始一个月。

答案 2 :(得分: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_field一个月提前 a.date_field值为1
  • 对于b.date_field一个月之前 a.date_field值为-1(负一)

撤销订单也会改变结果。

希望这能回答你的问题。