【问题标题】:DB2 UDF to return added date?DB2 UDF 返回添加的日期?
【发布时间】:2011-06-15 00:21:34
【问题描述】:

我正在尝试制作一个 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] 日期、时间或时间戳表达式无效。原因 。 . . . . : 发生以下情况之一: -- 加法操作数是日期,另一个不是日期持续时间。 -- 加法的一个操作数是时间,另一个不是持续时间。 -- 加法的一个操作数是时间戳,另一个不是持续时间。 -- 减法操作数是日期,另一个不是日期、字符或日期持续时间。 -- 减法操作数是一个时间,另一个不是时间、字符或持续时间。 -- 减法操作数是时间戳,另一个不是时间戳、字符或持续时间。恢复 。 . . :更正算术表达式,使其包含有效的日期、时间或时间戳表达式。再次尝试请求。

【问题讨论】:

标签: sql stored-procedures db2 user-defined-functions ibm-midrange


【解决方案1】:

这是一个简单的修复:

set result = inputDate + monthsToAdd MONTHS;

【讨论】:

  • 谢谢伊恩,我之前试过了,但它不起作用,它说“缺少语句结束”
  • @ZoHas 那么或许,只需省略SETRESULT 的声明,直接编码RETURN inputDate + monthsToAdd MONTHS NB,缺少分号
【解决方案2】:

实际上是在 v5r3 DB2 for i5/OS [以及 DB2 for 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

【讨论】:

  • 注意:在上面选择了 ADD_MONTHS 名称,因此不合格的引用最终将使用系统提供的标量函数进行新查询或重新创建的视图(如果可用);即假设创建和使用从 IBM i 6.1 之前的版本开始,DB2 for i 首先提供该标量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多