遗留的DB2 SQL查询简化

时间:2019-02-26 20:24:15

标签: sql db2 ibm-midrange

我们在AS / 400系统上安装了DB2数据库。 (是的,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 :(得分:3)

从v6.1开始,您可以使用TIMESTAMP_FORMAT函数将字符串转换为时间戳,并从那里转换为您选择的几乎任何格式。这是将包含180205(YYMMDD)的字符串转换为时间戳的方法。

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年以上旧操作系统的后果即可。

答案 1 :(得分:0)

在马克的答案提到的TIMESTAMP_FORMAT()可用之前……

最好的解决方案是创建一个用户定义函数(UDF),该函数可以为您处理转换。

您既可以自己发行,也可以找到开源版本。

Alan Campin的 iDate 代码是用于日期转换的完整UDF集合; downloadable here