ADD_MONTHS 函数

ADD_MONTHS 函数采用 DATETIME 或 DATE 表达式作为它的第一个参数,并需要第二个参数指定要添加到第一个参数值上的月数。第二个参数可为正的或负的。

返回的值是基于第二个参数指定的月数,作为 INTERVAL UNITS MONTH 值的第一个参数的 DATE 或 DATETIME 值的总和。

返回的数据类型依赖于第一个参数的数据类型:
  • 如果第一个参数求值为 DATE 值,则 ADD_MONTHS 返回 DATE 值。
  • 如果第一个参数求值为 DATETIME 值,则 ADD_MONTHS 返回 DATETIME YEAR TO FRACTION(5) 值,对于时间单位小于 day 的,其值与第一个参数中的相同。

如果在第一个参数中的 daymonth 时间单位指定该月的最后一天,或如果结果月的天数少于第一个参数中的 day,则返回的值为结果月的最后一天。否则,返回的值与第一个参数为该月的同一天。

如果结果月晚于第一个参数中那年的十二月(或对于负的第二个参数,早于一月),则返回的值可在不同的年份中。

下列查询使用列表达式作为参数,在 Projection 子句中调用 ADD_MONTHS 函数两次。在此,列名称表明列数据类型,且 DBDATE 设置为 MDY4/

SELECT a_serial, b_date, ADD_MONTHS(b_date, a_serial),
        c_datetime, ADD_MONTHS(c_datetime, a_serial)
        FROM mytab WHERE a_serial = 7;
在此示例中,ADD_MONTHS 返回 DATE 和 DATETIME 值:
a_serial      7
          b_date        07/06/2007
          (expression)  02/06/2008
          c_datetime    2007-10-06 16:47:49.00000
          (expression)  2008-05-06 16:47:49.00000
        
如果您使用主变量来存储 ADD_MONTHS 的参数,但在准备时刻不知道该参数的数据类型,则 GBase 8s 假设数据类型为 DATETIME YEAR TO FRACTION(5)。如果在运行时刻,在已准备了该语句之后,用户为主变量提供 DATE 值,则数据库服务器发出错误 -9750。要防止此错误,请通过使用强制转型来指定主变量的数据类型,如在此程序片断中所示:
sprintf(query, ", 
          "select add_months(?::date, 6) from mytab");
          EXEC SQL prepare selectq from :query;
          EXEC SQL declare select_cursor cursor for selectq;
          EXEC SQL open select_cursor using :hostvar_date_input;
          
          EXEC SQL fetch select_cursor into :var_date_output;