Преобразование CHAR в TIMESTAMP в DB2 iSeries - PullRequest
1 голос
/ 16 февраля 2012

Я безуспешно пытаюсь найти способ конвертировать CHAR в TIMESTAMP в DB2 iSeries, вы можете мне помочь?

Например: 20120216

Ожидаемый результат: 16.02.2012, 12:00:00

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

-

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

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

Спасибо MRizq

Ответы [ 2 ]

5 голосов
/ 16 февраля 2012

Чтобы использовать 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 голосов
/ 25 февраля 2016

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

Предположим, что значение 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, чтобы последовательно выполнить каждый следующий оператор.

...