Oracle 19c中mmddyy格式转日期返回20xx而非19xx的问题求助
Oracle 19c:将mmddyy格式的'031537'转换为1937年而非2037年的解决办法
问题中使用to_date('031537','mmddyy')和to_date('031537','mmddyrr')都返回2037年,原因如下:
YY格式掩码会直接使用当前世纪,所以两位年份'37'会被解析为2037年。RR格式掩码的世纪判断规则依赖当前年份的后两位:- 若输入的两位年份在00-49区间,且当前年份后两位也在00-49区间,Oracle会使用当前世纪(20xx);
- 只有当输入的两位年份在50-99区间,且当前年份后两位在00-49时,才会自动映射到上一个世纪(19xx)。
由于当前年份(比如2024)的后两位在00-49,输入的'37'属于00-49区间,所以RR同样返回2037年。
可行的解决办法:
方法1:手动指定世纪,构造四位年份字符串
直接截取输入字符串的前4位(mmdd),拼接'19'和后两位(yy),再用mmddyyyy格式解析:
SELECT TO_DATE(SUBSTR('031537', 1, 4) || '19' || SUBSTR('031537', 5, 2), 'mmddyyyy') FROM DUAL;
执行结果:03/15/1937
方法2:修改会话级NLS参数调整RR规则(适合批量统一处理)
如果你的业务场景中,所有两位年份≤49的日期都需要映射到19世纪,可以修改会话的NLS_TERRITORY参数,部分地区(如英国)的RR规则分界点为30,输入'37'会被判定为属于上一个世纪:
ALTER SESSION SET NLS_TERRITORY = 'UNITED KINGDOM'; SELECT TO_DATE('031537', 'mmddyrr') FROM DUAL;
执行结果:03/15/1937
注意:该参数会影响会话内所有日期解析行为,需根据业务需求谨慎使用。
方法3:使用数值计算调整年份
先解析为日期,再通过ADD_MONTHS减去100年(1200个月):
SELECT ADD_MONTHS(TO_DATE('031537', 'mmddyy'), -1200) FROM DUAL;
执行结果:03/15/1937
这种方法适合已经解析出错误世纪的日期,快速修正年份。
内容的提问来源于stack exchange,提问作者kumar
相关产品推荐
相关产品推荐

