DB2 Iseries 4 从十进制发布铸造日期

DB2 Iseries 4 Issue casting date from decimal

我有十进制字段 (DECIMAL(8,0)),其中包含的日期为 5122019(2019 年 5 月 12 日)和 12122020(2020 年 12 月 12 日)。

我尝试了多种转换方式,包括 DATE(TIMESTAMP_FORMAT(CHAR(decimalField),'MMDDYYYY'))

但它们 return 无效。当个位数月份不包含前导零时,使用十进制 8,0 字段执行此操作的最佳方法是什么?

一个选项是 right-pad 带零的日期十进制字符串:

DATE(TIMESTAMP_FORMAT(
    RIGHT('0' || CHAR(decimalField), 8), 'MMDDYYYY'))

对于具有两位数月份的十进制字符串值,例如 12122020,上述逻辑将对相同的值进行操作。对于 5122019 这样的值,在尝试转换为 date/timestamp.

之前,我们会先用零填充以获得 05122019

综上所述,此处的最佳选项可能是将日期存储为日期类型,而不是小数或字符串表示形式。

如果您使用 LPAD() 则该字符串有 8 个字符:

select t.*,
       DATE(TIMESTAMP_FORMAT(LPAD(decimalField, 8, '0') , 'MMDDYYYY'))
from (SELECT 5122019 as decimalField
      FROM sysibm.sysdummy1
     ) t

Here 是一个 db<>fiddle.

您可能想要确保 DD 组件是 zero-padded。否则,您无法可靠地进行转换,因为 1112020 可能是 11 月 1 日或 1 月 11 日。

而不是连接字符串...

更好的选择可能是使用 DIGITS()

DATE(TIMESTAMP_FORMAT(DIGITS(decimalField) , 'MMDDYYYY'))

并不是零不存在,而是通过 CHAR() 隐式 转换丢失了它。