Oracle字符串转Date转Timestamp时1900年变为2000年如何解决

你出现年份转换错误的核心原因是两点:
- 多余的多层嵌套转换:先截取字符串前缀转DATE、再转字符串、再转TIMESTAMP的冗余流程,很容易出现格式匹配偏差,同时丢失了原字符串的时分秒、毫秒信息
- RRRR格式符的自动偏移逻辑:RRRR会根据当前年份自动推断2位年份的所属世纪,部分场景下会把19xx的年份误判为20xx,4位固定年份直接用YYYY更稳妥
你不需要做字符串截取,Oracle原生支持匹配ISO 8601格式的时间字符串,直接给TO_TIMESTAMP指定对应格式即可,写法如下:
SELECT TO_TIMESTAMP('1900-01-01T13:00:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z') FROM dual;
格式符说明:
- 用双引号包裹
T和Z,Oracle会将其识别为固定占位符,不需要修改原字符串就能直接匹配 YYYY表示4位完整年份,不会做自动世纪偏移,完全保留原字符串的年份信息FF3匹配3位精度的毫秒部分,对应你字符串末尾的.000格式
如果需要保留时区信息,可以直接转换为带时区的TIMESTAMP类型:
SELECT TO_TIMESTAMP_TZ('1900-01-01T13:00:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"') FROM dual;
内容的提问来源于stack exchange,提问作者jolly
相关产品推荐
相关产品推荐

