iSeries DB2 SQL - 使用CASE语句在UDF中更新变量

Kin*_*des -1 sql db2 user-defined-functions case-statement ibm-midrange

我正在尝试为DB2创建用户定义的函数,但无法弄清楚.我对t-sql感觉更舒服,这将以十几种方式实现.我需要帮助,因为我收到的所有内容都是神秘的错误消息,告诉我没有有效的令牌或其他类似的令牌.

基本前提是我试图将正常日期转换为整个数据库中使用的日期格式(cyymmdd)这里是伪代码:

Get current time;
If YEAR(current time) > 1999 then 1 else 0;
Run Code Online (Sandbox Code Playgroud)

很简单吧?无法让它发挥作用.这是实际的代码:

DECLARE Cn CHAR ( 1 ) ;
CASE
WHEN YEAR(X) > 1999
THEN SET Cn = 1;
ELSE SET Cn = 0;
Run Code Online (Sandbox Code Playgroud)

还尝试过:

DECLARE Cn CHAR ( 1 ) ;
CASE YEAR(X)
WHEN  > 1999
THEN SET Cn = 1;
ELSE SET Cn = 0;
Run Code Online (Sandbox Code Playgroud)

而那应该是悲惨的失败.

我真的不知道如何只用SQL将3/25/2014转换为1140325.我想我可以在应用程序逻辑中处理这个问题,但这不是我想要的方式.

提前致谢.

jam*_*man 6

将DATE转换为CYMD是一个简单的计算:

SELECT (YEAR(CURRENT_DATE) - 1900) * 10000 
  + MONTH(CURRENT_DATE) * 100 
  + DAY(CURRENT_DATE)
FROM SYSIBM.SYSDUMMY1;
Run Code Online (Sandbox Code Playgroud)

用于执行转换的UDF:

CREATE FUNCTION QGPL.DATE2CYMD(DATE DATE) RETURNS DEC(7)
LANGUAGE SQL
DETERMINISTIC
BEGIN
    RETURN (YEAR(DATE) - 1900) * 10000
    + MONTH(DATE) * 100
    + DAY(DATE);
END
Run Code Online (Sandbox Code Playgroud)

验证它是否正常工作的测试:

SELECT 
    QGPL.DATE2CYMD(CURRENT_DATE) CURRENT_CYMD, 
    QGPL.DATE2CYMD(CAST(NULL AS DATE)) NULL_CYMD
FROM SYSIBM.SYSDUMMY1;
Run Code Online (Sandbox Code Playgroud)

结果