2012-02-16 9 views
1

CHARをDB2 iSeriesのTIMESTAMPに変換する方法については、幸運にも助けてくれるでしょうか?DB2 AS/400システムでCHARを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

答えて

5

タイムスタンプとしてキャストするためには、値が有効な日付としてフォーマットする必要があります。 '20120216'はかなりありません。ダッシュが必要です: '2012-02-16'。あなたは、発信者が入力を再フォーマットすることはできません場合は、これらの線に沿って、それを自分で行う必要があるでしょう:

cast(date(substr(val,1,4) concat '-' 
    concat substr(val,5,2) concat '-' 
    concat substr(val,7,2)) as timestamp) 
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の「Run SQL Scripts」ウィンドウに貼り付けることです。最初の行にカーソルを置き、次にCtrl-Yを繰り返し押して、順番に各文を実行します。