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()
的 隐式 转换丢失了它。
我有十进制字段 (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()
的 隐式 转换丢失了它。