在DB2 iSeries中将CHAR转换为TIMESTAMP

时间:2012-02-16 13:04:54

标签: ibm-midrange time-series

我在Google上搜索如何将CHAR转换为DB2 iSeries中的TIMESTAMP而没有运气,你可以帮帮我吗?

例如:20120216

预期成果:16/2/2012 12:00:00 AM

MY 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

-

结果为null :(

有任何建议吗?

由于 MRizq

2 个答案:

答案 0 :(得分:5)

要将CAST作为时间戳,需要将值格式化为有效日期。 '20120216'并不存在,它需要破折号:'2012-02-16'。如果您不能让调用者重新格式化输入,您必须自己按照以下方式进行操作:

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

答案 1 :(得分:3)

我知道这已经得到了解答,但以下内容展示了一种可以说更清洁,更直接的方法。

假设您要转换的CHAR值为' 20140101'然后你可以做任何一件事:

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

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

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

-- Create a temp table to demonstrate with:
declare global temporary table DateExample (
  ID Integer,
  RealTSField Timestamp,
  DateCharField CHAR(8),
  TSCharField CHAR(20)
  ) with replace;

-- Insert a demo record to work with:
insert into session.DateExample values(1, '2014-01-01 12:30:23.123456', '20140101', '20140101123023123456');

-- Show what's in the table at this point:
select * from session.DateExample; 

-- Now show the conversions in action:
select 
  d.*,
  date(DateCharField||'000000') DateFromDateCharField, -- implicit conversion from YYYYMMDD via tacking on HHMISS as '000000' string
  timestamp(DateCharField||'000000') TSFromDateCharField, -- implicit conversion from YYYYMMDD via tacking on HHMISS as '000000' string
  timestamp(LEFT(TSCharField,14)) TSFromTSCharField, -- implicit conversion does not support fractional seconds hence we must use LEFT()
  timestamp_format(TSCharField, 'YYYYMMDDHH24MISSNNNNNN') TSFromCharField_ExplicitFormat --explicit conversion with timestamp_format
from session.DateExample d;

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