ADD_MONTHS

将指定的月数添加到日期并以 DATE 的形式返回总和。通常,ADD_MONTHS 返回与开始日期具有相同日部分的日期。例如:

=> SELECT ADD_MONTHS ('2015-09-15'::date, -2) "2 Months Ago";
 2 Months Ago
--------------
 2015-07-15
(1 row)

有两个例外:

  • 如果开始日期的日部分大于结果月份的最后一天,则 ADD_MONTHS 返回结果月份的最后一天。例如:

    => SELECT ADD_MONTHS ('31-Jan-2016'::TIMESTAMP, 1) "Leap Month";
     Leap Month
    ------------
     2016-02-29
    (1 row)
    
  • 如果开始日期的日部分是该月的最后一天,并且结果月份的天数比开始日期月份的天数多,则 ADD_MONTHS 返回结果月份的最后一天。例如:

    => SELECT ADD_MONTHS ('2015-09-30'::date,-1) "1 Month Ago";
     1 Month Ago
    -------------
     2015-08-31
    (1 row)
    

行为类型

  • 不可变,如果 start-date 实参为 TIMESTAMPDATE

  • 稳定,如果 start‑date 实参为 TIMESTAMPTZ

语法

ADD_MONTHS ( start‑date, num‑months );

参数

start‑date
要处理的日期,是求值结果具有以下一种数据类型的表达式:
  • DATE

  • TIMESTAMP

  • TIMESTAMPTZ

num‑months
整数表达式,指定要添加到 start‑date 中或从中减去的月数。

示例

在当前日期上加一个月:

=> SELECT CURRENT_DATE Today;
   Today
------------
 2016-05-05
(1 row)

VMart=> SELECT ADD_MONTHS(CURRENT_TIMESTAMP,1);
 ADD_MONTHS
------------
 2016-06-05
(1 row)

从当前日期减去四个月:

=> SELECT ADD_MONTHS(CURRENT_TIMESTAMP, -4);
 ADD_MONTHS
------------
 2016-01-05
(1 row)

2016 年 1 月 31 日加一个月:

=> SELECT ADD_MONTHS('31-Jan-2016'::TIMESTAMP, 1) "Leap Month";
 Leap Month
------------
 2016-02-29
(1 row)

以下示例将时区设置为 EST;然后它将 24 个月添加到指定 PST 时区的 TIMESTAMPTZ,因此 ADD_MONTHS 会考虑时间变化:

=> SET TIME ZONE 'America/New_York';
SET
VMart=> SELECT ADD_MONTHS('2008-02-29 23:30 PST'::TIMESTAMPTZ, 24);
 ADD_MONTHS
------------
 2010-03-01
(1 row)