我在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
答案 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连续运行每个语句以跟随。