Ibm midrange 在DB2iSeries中将字符转换为时间戳

Ibm midrange 在DB2iSeries中将字符转换为时间戳,ibm-midrange,time-series,Ibm Midrange,Time Series,我在谷歌上搜索过如何在DB2iSeries中将字符转换为时间戳,但运气不好,你能帮我吗 例:20120216 预期结果:2012年2月16日上午12:00:00 我的UDF: CREATE FUNCTION TEST.CONVERT_TO_TIMESTAMP (VAL CHARACTER VARYING(20)) RETURNS TIMESTAMP LANGUAGE SQL SPECIFIC TEST.CONVERT_TO_TIMESTAMP MODIFIES SQL DATA CALLED O

我在谷歌上搜索过如何在DB2iSeries中将字符转换为时间戳,但运气不好,你能帮我吗

例:20120216

预期结果:2012年2月16日上午12:00:00

我的UDF:

CREATE FUNCTION TEST.CONVERT_TO_TIMESTAMP (VAL CHARACTER VARYING(20))
RETURNS TIMESTAMP
LANGUAGE SQL
SPECIFIC TEST.CONVERT_TO_TIMESTAMP
MODIFIES SQL DATA
CALLED ON NULL INPUT
FENCED
DISALLOW PARALLEL
NO EXTERNAL ACTION
BEGIN ATOMIC
DECLARE SQLCODE INTEGER DEFAULT 0 ;
DECLARE RETCODE INTEGER DEFAULT 0 ;
DECLARE RET TIMESTAMP ;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION , SQLWARNING , NOT FOUND
BEGIN
SET RETCODE = SQLCODE ;
END ;

IF ( VAL IS NOT NULL ) THEN
SET RET = CAST ( VAL AS TIMESTAMP ) ;
 ELSE
SET RET = NULL ;
  END IF ;

 RETURN RET ;

 END 
 GO
--

结果为空:(

有什么建议吗

谢谢
MRizq

为了转换为时间戳,需要将该值格式化为有效日期。“20120216”不在那里,它需要破折号:“2012-02-16”。如果您不能让调用方重新格式化输入,您必须按照以下几行操作:

cast(date(substr(val,1,4) concat '-' 
   concat substr(val,5,2) concat '-' 
   concat substr(val,7,2)) as timestamp)

为了强制转换为时间戳,需要将该值格式化为有效日期。“20120216”不完全存在,它需要破折号:“2012-02-16”。如果无法让调用者重新格式化输入,则必须按照以下方式进行:

cast(date(substr(val,1,4) concat '-' 
   concat substr(val,5,2) concat '-' 
   concat substr(val,7,2)) as timestamp)

我知道这一点已经得到了回答,但下面展示了一种可以说更干净、更直接的方法

假设要转换的字符值为“20140101”,则可以执行以下操作之一:

select date('20140101'||'000000') from sysibm.sysdummy1;

下面是一个包含更多函数和转换的更完整示例,演示如何从实际(尽管是临时)表中选择和转换数据:


可能最简单的尝试方法是粘贴到Ops Navigator的“运行SQL脚本”窗口中,将光标放在第一行,然后反复按Ctrl-Y以依次运行每个语句。

我知道这已经得到了回答,但下面演示了一种更干净、更直接的方法

假设要转换的字符值为“20140101”,则可以执行以下操作之一:

select date('20140101'||'000000') from sysibm.sysdummy1;

下面是一个包含更多函数和转换的更完整示例,演示如何从实际(尽管是临时)表中选择和转换数据:

可能最简单的方法是粘贴到Ops Navigator的“运行SQL脚本”窗口中,将光标放在第一行,然后反复按Ctrl-Y以依次运行每个语句