我正在尝试为DB2创建一个用户定义的函数,但无法弄明白。我对t-sql感觉更舒服,这可以通过十几种方式实现。我需要帮助,因为我收到的所有信息都是含糊不清的错误消息,告诉我没有有效的令牌或其他类似的消息。
基本前提是我试图将正常日期转换为整个数据库中使用的日期格式(cyymmdd)这里是伪代码:
Get current time;
If YEAR(current time) > 1999 then 1 else 0;
够简单吧?无法让它发挥作用。 这是实际的代码:
DECLARE Cn CHAR ( 1 ) ;
CASE
WHEN YEAR(X) > 1999
THEN SET Cn = 1;
ELSE SET Cn = 0;
也尝试过:
DECLARE Cn CHAR ( 1 ) ;
CASE YEAR(X)
WHEN > 1999
THEN SET Cn = 1;
ELSE SET Cn = 0;
这应该失败了。
我真的不知道如何只使用SQL将3/25/2014转换为1140325。我想我可以在应用程序逻辑中处理这个问题,但这不是我想要的方式。
先谢谢。
答案 0 :(得分:6)
将DATE转换为CYMD是一个简单的计算:
SELECT (YEAR(CURRENT_DATE) - 1900) * 10000
+ MONTH(CURRENT_DATE) * 100
+ DAY(CURRENT_DATE)
FROM SYSIBM.SYSDUMMY1;
执行转换的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
验证其工作正常的测试:
SELECT
QGPL.DATE2CYMD(CURRENT_DATE) CURRENT_CYMD,
QGPL.DATE2CYMD(CAST(NULL AS DATE)) NULL_CYMD
FROM SYSIBM.SYSDUMMY1;
答案 1 :(得分:2)
在大多数情况下,您可以将CASE
视为功能。 CASE
结构选择表达式;它不执行语句。实际上,它返回一个值作为函数或任何表达式。
以下是一些编码变体,这些变化都会导致MYCENT设置为“1”或“0”:
DECLARE MYCENT CHAR ( 1 ) ;
DECLARE MYYEAR BIGINT ;
SET MYYEAR = YEAR ( CURRENT DATE ) ;
SET MYCENT = CASE WHEN MYYEAR > 1999 THEN '1' ELSE '0' END ;
or
IF ( MYYEAR > 1999 )
THEN SET MYCENT = '1' ;
ELSE SET MYCENT = '0' ;
END IF ;
SET MYCENT = CASE WHEN YEAR(CURRENT DATE) > 1999 THEN '1' ELSE '0' END ;
请注意,两个CASE示例都使用单个WHEN...THEN...
子句,但您可以根据需要使用多个IF
子句。另请注意,使用SET
在每个分支中都有CASE
语句,但CASE
只选择要返回的值。 (该值是表达式的一种形式。)
作为SQL的语法元素,CASE
被称为 case-expression 。作为表达式,您通常可以在变量可能有效的任何地方使用{{1}}。