2012-02-16 2 views
1

운이없는 DB2 iSeries에서 CHAR를 TIMESTAMP로 변환하는 방법에 대해 살펴 보았습니다.DB2 iSeries에서 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

타임 스탬프로 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) 
3

나는이 답변이 이미 알고 있지만, 다음은 틀림없이 깨끗하고 더 직접적인 접근 방식을 보여줍니다. 것으로,

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

또는 여기

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

더 많은 기능과 전환이보다 ​​완전한 예를 들어 다음과 같습니다 변환 할 CHAR 값을 가정 할

'20140101'다음 중 하나를 수행 할 수있다 실제 (임시 임에도 불구하고) 표에서 데이터를 선택하고 변환하는 방법을 보여줍니다.

-- 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를 반복해서 눌러 각 문을 연속적으로 따라 실행하는 것입니다.

관련 문제