Вот более многократно используемое решение - и может сделать намного больше, чем вам нужно - это глобальная функция - или для любителей nvo вы можете выбрать одно из них:
/ *
ЧТО ЭТО ДЕЛАЕТ
передать дату и дни, месяцы, годы, которые вы хотели бы добавить к ней
и он возвращает новую дату
1010 * ИСПОЛЬЗОВАНИЕ *
Вы можете отправить любое число в ai_days ai_months ai_years, включая отрицательные числа
и месяцев больше 12 (например, ai_months = -18 означает 18 месяцев в прошлом)
АРГУМЕНТЫ
дата adt_change - пройти и вернуться с измененной датой
intger ai_days
целое число ai_months
целое число ai_years
возвращаемое целое число
* /
1028 * попробовать *
целое число li_add_years
целое число li_new_day
целое число li_new_month
целое число li_new_year
целое число li_total_months
добавить дни
если ai_days <> 0, то
adt_change = относительный срок (adt_change, ai_days)
если isnull (adt_change), тогда бросить STOP
конец если
сохранить измененные день, месяц и год
li_new_day = день (adt_change)
if isnull(li_new_day) then throw STOP
li_new_month = месяц (adt_change)
if isnull(li_new_month) then throw STOP
li_new_year = год (adt_change)
if isnull(li_new_year) then throw STOP
изменить месяц
если ai_months <> 0, то
li_total_months = li_new_month + ai_months
li_new_month = mod(li_total_months,12)
if isnull(li_new_month) then throw STOP
li_add_years = int(li_total_months/12)
if isnull(li_add_years) then throw STOP
if li_total_months <=0 then li_new_month += 12
конец, если
изменить год
li_new_year + = li_add_years + ai_years
дата сброса
adt_change = date (li_new_year, li_new_month, li_new_day)
if adt_change = 1900-01-01 or isnull(adt_change) then
бросить стоп
возврат УСПЕХ
catch (runtimeerror lrteo_error)
return logerror (lrteo_error)
конец попытки