DB2 UDF, чтобы вернуть добавленную дату?

Я пытаюсь создать DB2 UDF, который вводит дату и возвращает новую дату с добавлением нескольких месяцев. Синтаксис запроса для этого шага должен использовать

 select date + 12 months from sysibm.sysdummy1;

Внутри UDF я не могу заставить это работать

monthsToAdd INTEGER;
SET monthsToAdd=4;
set result= inputDate + monthsToAdd + MONTHS;
return result;

Это говорит

Состояние SQL: 42816 Код поставщика: -182 Сообщение: [SQL0182] Недействительное выражение даты, времени или метки времени. Причина . . . . . : Произошло одно из следующего: - Операнд сложения - это дата, а другой - не продолжительность даты. - Операнд сложения - это время, а другой - не продолжительность. - Операнд сложения - это отметка времени, а другой - не продолжительность. - Операнд вычитания - это дата, а другой - не дата, символ или продолжительность даты. - Операнд вычитания - это время, а другой - не время, символ или длительность времени. - Операнд вычитания - это отметка времени, а другой - не отметка времени, символ или продолжительность. Восстановление . . . : Исправьте арифметическое выражение так, чтобы оно содержало допустимое выражение даты, времени или метки времени. Попробуйте запрос еще раз.


person Zo Has    schedule 25.01.2011    source источник
comment
Является ли ошибка ошибкой времени компиляции (можете ли вы создать процедуру?) Или ошибкой времени выполнения? Не могли бы вы опубликовать весь stmt процедуры создания?   -  person Lynette Duffy    schedule 26.01.2011
comment
Любая причина не просто использовать скалярную функцию DB2 ADD_MONTHS, доступную с DB2 для IBM i 6.1, январь 2008 г .; возможно, все еще на v5r4 в то время? Для справки: документ о более свежем выпуске на странице IBM i 7.2- ›База данных - ›Справочник-› Справочник по SQL- ›Встроенные функции-› Скалярные функции- ›ADD_MONTHS   -  person CRPence    schedule 09.10.2016


Ответы (2)


Это простое решение:

set result = inputDate + monthsToAdd MONTHS;
person Ian Bjorhovde    schedule 25.01.2011
comment
Спасибо, Ян, я пробовал это раньше, но это не сработает, он говорит: «Конец инструкции отсутствует» - person Zo Has; 26.01.2011
comment
@ZoHas Тогда, возможно, просто опустите SET и декларативную для RESULT и просто введите RETURN inputDate + monthsToAdd MONTHS NB, отсутствие точки с запятой - person CRPence; 09.10.2016

Как фактически написано в v5r3 DB2 для i5 / OS [а также с DB2 для IBM i 7.3]:

create function add_months             
( inputDate   DATE                     
, monthsToAdd INTEGER                  
) returns DATE                         
language SQL DETERMINISTIC             
  RETURN inputDate + monthsToAdd MONTHS

select add_months(date'2016-04-12', 6)
from sysibm.sysdummy1
-- likeness of a report from above query follows:
ADD_MONTHS
2016-10-12
person CRPence    schedule 09.10.2016
comment
Примечание. Имя ADD_MONTHS было выбрано выше, поэтому неквалифицированные ссылки в конечном итоге будут использовать предоставляемую системой скалярную функцию для новых запросов или повторно созданных VIEW, если они доступны; т.е. предполагается, что создание и использование начинается с выпуска до IBM i 6.1, в котором DB2 for i сначала предоставляет этот скаляр. - person CRPence; 09.10.2016