如何解决DD-MON-YY转YYYYMMDD时年份变为20XX的问题?
解决Oracle中两位年份解析为错误世纪的问题
这问题太常见了!你遇到的是Oracle TO_DATE函数处理两位年份时的默认行为问题——用YY格式掩码的话,Oracle会直接把两位年份补全为当前世纪,所以'97'就被解析成2097了,而不是我们期望的1997。
为什么会这样?
YY格式:不管输入的两位年份是多少,都使用当前世纪(比如现在是21世纪,所有两位年份都会被转成20xx)。RR格式:这是Oracle专门用来处理两位年份的智能格式,它会根据当前年份的后两位来判断应该使用哪个世纪:- 如果输入的两位年份大于当前年份的后两位,就用上一个世纪(比如当前是2024,输入25-99会被解析为1925-1999);
- 如果输入的两位年份小于等于当前年份的后两位,就用当前世纪(输入00-24会被解析为2000-2024)。
正确的实现方法
只需要把TO_DATE里的格式掩码从'DD-MON-YY'改成'DD-MON-RR'就行:
TO_CHAR(TO_DATE(CHD_DATE_FIRST_ACT,'DD-MON-RR'),'YYYYMMDD')
这样当输入'27-SEP-97'时,就会正确解析为1997年9月27日,输出结果就是19970927。
额外说明
如果你的业务有特殊的年份分界规则(比如希望把60-99都当成19xx,00-59当成20xx),可以考虑自定义处理逻辑,但RR格式已经能覆盖绝大多数常见的两位年份解析场景啦。
内容的提问来源于stack exchange,提问作者Shubham Sharan
相关产品推荐
相关产品推荐

