AS/400数据库中YYMMDD格式出生日期转换年份错误的解决方法
解决AS/400中YYMMDD格式日期转换为正确年份的问题
出现840212被解析为2084的问题,是因为TIMESTAMP_FORMAT默认使用的世纪分界规则不符合你的数据实际情况。以下是几种针对性的解决方法:
方法1:指定TIMESTAMP_FORMAT的世纪范围参数
直接在TIMESTAMP_FORMAT函数中添加第三个参数,明确两位年份对应的世纪区间。比如设置1940-2039的范围,让40-99的两位年份映射到19xx,00-39映射到20xx:
SELECT name, birthdt, varchar_format(timestamp_format(birthdt,'YYMMDD','1940-2039'),'DD/MM/YYYY') AS Birthdate FROM QS36F.Table
这个参数的格式为'起始年-结束年',可以根据你的数据实际年份范围调整,比如如果所有出生日期都是1950年及以后,也可以设为'1950-2049'。
方法2:手动拼接世纪前缀(精确可控)
通过判断两位年份的范围,手动拼接19或20前缀后转日期,完全避免系统默认规则的影响:
若birthdt是字符型字段
SELECT name, birthdt, varchar_format( date(CASE WHEN SUBSTR(birthdt, 1, 2) >= '50' THEN '19' || birthdt ELSE '20' || birthdt END), 'DD/MM/YYYY' ) AS Birthdate FROM QS36F.Table
若birthdt是数字型字段
先将数字转为固定长度的字符串再处理:
SELECT name, birthdt, varchar_format( date(CASE WHEN SUBSTR(CHAR(birthdt, 6), 1, 2) >= '50' THEN '19' || CHAR(birthdt, 6) ELSE '20' || CHAR(birthdt, 6) END), 'DD/MM/YYYY' ) AS Birthdate FROM QS36F.Table
这种方法适合你明确知道数据年份分布的场景,比如老系统中的出生日期基本都是19xx年,直接通过判断两位年份是否大于等于50来拼接世纪。
方法3:修改系统默认日期解析规则(不推荐)
AS/400可以通过调整系统值QRYDATFMT或相关日期格式参数来改变全局的两位年份解析规则,但这种操作会影响整个系统的所有应用,除非所有业务都需要统一的世纪分界规则,否则优先使用前两种局部解决方法。
内容的提问来源于stack exchange,提问作者user10191234
相关产品推荐
相关产品推荐

