如何在DB2数据库中创建一个函数来将整数转换为日期,并且大小写为0时的情况?

时间:2011-11-14 09:49:00

标签: db2

我试图让函数在db2中运行:

CREATE FUNCTION TO_DATE8(DATE_STRING numeric(8,0))
    RETURNS DATE
    LANGUAGE SQL
    IF DATE_STRING > 0 THEN
         // ERROR ->
         RETURN DATE ( TO_DATE ( SUBSTR ( DATE_STRING , 1 , 8 ) , 'YYYYMMDD' ) )
    ELSE
         RETURN  DATE ( TO_DATE ( '00000000' , 'YYYYMMDD' ) ) 
    END IF
END

错误:日期无效

怎么办?

2 个答案:

答案 0 :(得分:2)

所需程序的形式似乎是这样的(至少在iSeries版本上):

CREATE FUNCTION TO_DATE8(DATE_STRING numeric(8,0))          
RETURNS DATE                                            
LANGUAGE SQL
BEGIN
    RETURN(CASE WHEN DATE_STRING > 0 THEN DATE(SUBSTR(DATE_STRING, 1, 4) || '-' || 
                                               SUBSTR(DATE_STRING, 5, 2) || '-' || 
                                               SUBSTR(DATE_STRING, 7, 2))
                ELSE DATE('0001-01-01')
                END);
END

但是:

  • 您的程序名称错误(从日期-8读取,而不是)。
  • 您的DATE_STRING不是string(甚至是char),它是数字。请将其重命名为 not 包含数据类型的内容(dateToConvert正常工作)
  • 您似乎想要返回有效日期(所有0 s)的内容。我在这里返回*loval,虽然它可能实际上应该是null
  • 我没有对有效日期进行足够的检查 - 这会轻易炸掉
  • 如果可能,应将数据库更改为包含实际日期,而不是数字值。磁盘是(相对于程序员/架构师的头痛)便宜。
  • 如果8位数字是其中一列,您也可以找到有用的日历文件。

答案 1 :(得分:1)

对于其他人的利益,这可以在一行而不是一个函数中完成:

当MYDATE = 0时的情况那么空的日期(插入(插入(左(CHAR(MYDATE),8),5,0,' - '),8,0,' - '))结束

MYDATE在我的案子中被打包了。