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

将一个月添加到保存日期(oracle),oracle,date-arithmetic,Oracle,Date Arithmetic,我有一个包含日期类型属性的表a。我想写一个查询来选择另一个表B中的日期,该表的值比a中的值晚一个月。有人知道如何在oracle中这样做吗 您需要在Oracle中使用ADD_MONTHS功能 其他信息:如果您想将此功能与今天的日期一起使用,您可以使用添加月份(SYSDATE,1)从现在起获得一个月。嗯。。。这是谷歌的第一次成功: 您似乎正在寻找“添加月份”功能。问题是从表b中选择一个日期字段,其中表b的日期字段比表a中的日期字段提前一个月 必须考虑到一项附加要求,这项要求目前未在问题中明确说明

我有一个包含日期类型属性的表a。我想写一个查询来选择另一个表B中的日期,该表的值比a中的值晚一个月。有人知道如何在oracle中这样做吗

您需要在Oracle中使用
ADD_MONTHS
功能


其他信息:如果您想将此功能与今天的日期一起使用,您可以使用
添加月份(SYSDATE,1)
从现在起获得一个月。

嗯。。。这是谷歌的第一次成功:


您似乎正在寻找“添加月份”功能。

问题是从表b中选择一个日期字段,其中表b的日期字段比表a中的日期字段提前一个月

必须考虑到一项附加要求,这项要求目前未在问题中明确说明。我们是否对整月(不考虑月天数)感兴趣,还是希望包括可能取消提前一个月但仅提前几天的日期的天数(例如:a=2011-04-30和b=2011-05-01,b提前一个月但仅提前一天)

在第一种情况下,我们必须将两个日期截断为其年和月值:

SELECT TRUNC( TO_DATE('2011-04-22','yyyy-mm-dd'), 'mm') as trunc_date
   FROM dual;
给出:

  trunc_date
  ----------
  2011-04-01
在第二种情况下,我们不必修改日期

至少可以使用两种方法来解决初始问题:

第一个是在表a中的date_字段中添加一个月,然后在表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
在这里,以月为单位的字段顺序很重要。在提供的示例中:

  • 对于b.date_字段,在a.date_字段前一个月的值为1
  • 对于b.date_字段,在a.date_字段之前一个月的值为-1(负一)
颠倒顺序也会颠倒结果


希望这能回答您的问题。

您如何定义“一个月”?i、 e.如果来源日期是1月31日,那么目标日期是什么?2月28日还是29日?3月的某一天?3月的第一天。正好是1月31日之后的一个月。3月的第一天没有什么意义。它是向前两个月,或者向前29天或30天。好吧,不管怎样,例如保存日期后2天,我能做什么?@user623906:为什么
1月31日+1个月
=
3月1日
?为什么不
3月2日
2月28日/29日
?不,我看到了,它是系统日期,不是表中保存的日期。