Устаревшее упрощение конкатенации SQL-запросов DB2 - PullRequest
0 голосов
/ 26 февраля 2019

У нас установлена ​​база данных DB2 в системе AS / 400.(Да, IBM несколько раз переименовала его)

Вы можете видеть избыточность, когда я делаю свою конкатенацию с фрагментами строк.

Я видел некоторые решения, но имейте в виду, чтомногие не работают, так как наша база данных - довольно старая нестандартная версия DB2.Есть ли способ уменьшить избыточность при расчете CHAR (19000000 + a10)?Он работает, но конвертируется намного чаще, чем нужно.

SELECT DISTINCT pdk01.a00 AS POLICY, 
                    pdk01.b27_mins_name AS "INS NAME", 
                    substr(CHAR(19000000 + a10), 1, 4) || '/' || substr(CHAR(19000000 + a10), 5, 2) || '/' || substr(CHAR(19000000 + a10), 7, 2) as "Orig Eff Date",                    
                    substr(CHAR(19000000 + a09), 1, 4) || '/' || substr(CHAR(19000000 + a09), 5, 2) || '/' || substr(CHAR(19000000 + a09), 7, 2) AS "Expire Date", 
                    pdk01.a21_mtotal_prem AS PREMIUM 
    FROM   mudata.pdk01 AS PDK01 
           INNER JOIN mudata.pdk04 AS PDK04 
                   ON pdk01.a00_m1_pol_num = pdk04.a00_m4_pol_num 
    WHERE  pdk01.a11_mnext_act_code <> 'P' 
           AND pdk04.b83 = '91342' 
    ORDER  BY pdk01.a00 asc;

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

До появления TIMESTAMP_FORMAT(), в котором упоминается ответ Марка ...

Наилучшим решением было создание пользовательской функции (UDF), которая выполняла бы преобразование для вас.

Вы можете либо свернуть свою собственную версию, либо найти версию с открытым исходным кодом.

Код iDate Алана Кэмпина представляет собой полный набор пользовательских функций для преобразования даты; можно загрузить здесь

0 голосов
/ 26 февраля 2019

Начиная с версии 6.1, вы можете использовать функцию TIMESTAMP_FORMAT, чтобы превратить строку символов в метку времени, а оттуда - практически в любой формат, который вы выберете.Вот как можно преобразовать строку символов, содержащую 180205 (ГГММДД), в отметку времени.

TIMESTAMP_FORMAT(field, 'YYMMDD')

Чтобы изменить это просто поле даты, вы можете сделать это следующим образом:

DATE(TIMESTAMP_FORMAT(field, 'YYMMDD'))

Чтобы преобразовать его в символьное поле с разделителями, выполните следующие действия:

CHAR(DATE(TIMESTAMP_FORMAT(field, 'YYMMDD')), ISO)

Конечно, ISO использует - вместо / в качестве разделителя, поэтому вам необходимо заменить их на:

REPLACE(CHAR(DATE(TIMESTAMP_FORMAT(field, 'YYMMDD')), ISO), '-', '/')

Если ваша версия старше, чем v6.1, вам просто придется иметь дело с последствиями наличия операционной системы старше 12 лет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...