IBM определяет * формат даты JUL как гг / ддд . Обычно он не используется, но является доступным стандартным форматом, поддерживаемым в AS / 400. Вы говорите, что у вас есть строка, поэтому предполагается, что она хранится в виде CHAR (5) или 5A в DDS.
Если ваш столбец называется jdt , получите правильное количество цифр в вашей строке в SQL с помощью:
RIGHT(('00000' || TRIM(jdt)),5)
Теперь вставьте косую черту в:
INSERT( RIGHT(('00000'||TRIM(jdt)),5) ,3,0,'/')
DB2 / 400 может привести это поле к реальной дате, но оно будет работать правильно, только если вы сможете SET OPTION DATFMT=*JUL
. Как это сделать из C # в Windows будет зависеть от того, как вы подключаетесь.
Предположим, вы не можете найти способ установить формат даты в вашем соединении.
Решение: Создать пользовательскую функцию [UDF] в DB2.
Сначала выберите подходящую библиотеку для хранения функции и установите ее в качестве текущей библиотеки. В OS / 400 CL CHGCURLIB yourlib
или в SQL SET SCHEMA = yourlib
. Таким образом, по умолчанию все, что вы создадите, попадет в эту библиотеку.
Я рекомендую хранить определение SQL для вашей UDF в исходном члене. (Спросите, если незнаком). Вы можете выполнить источник с помощью команды RUNSQLSTM
.
Ваше определение функции может выглядеть примерно так:
CREATE FUNCTION CvtJul2Date( jdtin char(5) ) RETURNS DATE
LANGUAGE SQL
SPECIFIC CVTJUL2DT
DETERMINISTIC NO EXTERNAL ACTION
CONTAINS SQL
RETURNS NULL ON NULL INPUT
SET OPTION DATFMT = *JUL
BEGIN
RETURN(
date( insert( right(('00000'||trim(jdtin)),5) ,3,0,'/') )
);
END
Параметр * JUL распространяется на UDF. Любой запрос SQL, выполняемый в AS / 400, должен иметь возможность выполнять это преобразование независимо от DATFMT задания (при условии, что вы поместили эту функцию в библиотеку, которая находится в списке библиотек этого задания).