0

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

4

3 回答 3

8

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

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

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

于 2011-04-17T08:00:43.313 回答
6

您需要ADD_MONTHS在Oracle 中使用该功能。

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

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

于 2011-04-17T08:00:05.867 回答
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
  • 对于 a.date_field前一个月的 b.date_field,值为 -1(负一)

颠倒顺序也会颠倒结果。

希望这能回答你的问题。

于 2011-04-22T18:25:57.327 回答