十进制 CYYMMDD 是一种标准的 IBM 格式,其中 C 在 1900 年代为 0,在 2000 年代为 1。这可以追溯到 S/38(大约 1982 年)或更早。但我不记得他们在 S/38 之前使用过它,S/38 是 AS/400 和 iSeries 的前身。
我建议在 DB2 中创建一个用户定义的函数来将十进制日期转换为 ISO 日期值。DB2 for i 将缓存 DETERMINISTIC 函数的结果,因此不必在每次看到之前处理过的日期值时重新计算该函数。
更新
这是一个示例,我将 ccyymmd 或 yymmdd 格式的压缩十进制 (8,0) 值转换为 DB2 日期:
CREATE OR REPLACE FUNCTION
Cvt_Dec8cymd_to_Date ( dtin dec(8,0) )
returns date
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC -- caches results
NO EXTERNAL ACTION
RETURNS NULL ON NULL INPUT
NOT FENCED
SET OPTION DBGVIEW = *SOURCE
prc: BEGIN NOT ATOMIC -- don't rollback on error
DECLARE ans date;
DECLARE cymd dec(8,0);
-- add declarations for conditions and handlers here
SET ans = null;
CASE
WHEN dtin > 999999 THEN -- more than 6 digits given
set cymd = dtin;
WHEN dtin < 400000 THEN -- yr < 40 means 2000's
SET cymd = 20000000 + dtin;
ELSE -- yr >= 40 means 1900's
SET cymd = 19000000 + dtin;
END CASE;
--convert to date
SET ans = date( insert(insert(digits(cymd),7,0,'-'),5,0,'-') );
RETURN ans;
END prc
;
这是一个简单的逻辑,没有对无效值的错误处理。
其他人可能有一个更好的例子,或者可能会改进这个例子。