2012-02-16 2 views
1

У меня есть googling о том, как преобразовать CHAR в TIMESTAMP в DB2 iSeries без везения, может ли помочь мне?Преобразование CHAR в TIMESTAMP в DB2 iSeries

Например: 20120216

Ожидаемый результат: 16/2/2012 12:00:00 AM

МОЯ 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 

-

И результат нулевой :(

Любые предложения?

Thanks 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

Я знаю, что это уже ответил, но следующий демонстрирует, возможно, чище и более прямой подход.

Предположив значение 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 Scripts», поместив курсор в первую строку, затем многократно нажимая Ctrl-Y, чтобы последовательно запускать каждое утверждение, чтобы следовать дальше.

Смежные вопросы