旧版DB2 SQL查询限制简化



我们在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;

从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岁以上操作系统的后果。

TIMESTAMP_FORMAT()的可用性之前,标记的答案提到...

最好的解决方案是创建一个为您处理转换的用户定义功能(UDF)。

您可以自己滚动或找到开源版本。

Alan Campin的 IDATE 代码是一个完整的UDFS集,用于日期转换;可下载此处

相关内容

  • 没有找到相关文章

最新更新