ADD_MONTHS 函数采用 DATETIME 或 DATE 表达式作为它的第一个参数,并需要第二个参数指定要添加到第一个参数值上的月数。第二个参数可为正的或负的。
返回的值是基于第二个参数指定的月数,作为 INTERVAL UNITS MONTH 值的第一个参数的 DATE 或 DATETIME 值的总和。
返回的数据类型依赖于第一个参数的数据类型:
l 如果第一个参数求值为 DATE 值,则 ADD_MONTHS 返回 DATE 值。
l 如果第一个参数求值为 DATETIME 值,则 ADD_MONTHS 返回 DATETIME YEAR TO FRACTION(5) 值,对于时间单位小于 day 的,其值与第一个参数中的相同。
如果在第一个参数中的 day 和 month 时间单位指定该月的最后一天,或如果结果月的天数少于第一个参数中的 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;