SQL更新查询中年份>=2050时DATE_OF_RETIREMENT字段年份更新错误问询
问题原因分析
- 核心原因是你使用2位年份的字符串给日期字段赋值,触发了数据库的2位年份自动补全世纪规则。
- 目前主流关系型数据库(尤其是Oracle)默认采用RR日期格式作为2位年份的补全逻辑,规则如下:
当输入的2位年份值 < 50时,自动补全为20xx年;当输入的2位年份值 ≥50时,自动补全为19xx年。
- 对应你的操作示例可以验证规则:
- 赋值
'30-APR-49'时,2位年份49小于50,自动补全为2049,和预期一致 - 赋值
'30-APR-52'时,2位年份52大于等于50,自动补全为1952,与你预期的2052不符,因此出现异常。
- 赋值
修复方案
- 方案1:赋值时直接使用4位年份,例如把
'30-APR-52'改成'30-APR-2052',完全规避自动补全逻辑,这是最稳妥的方案。 - 方案2:如果业务场景必须使用2位年份,可以显式指定日期格式转换,例如Oracle环境下使用
TO_DATE('30-APR-52', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN')语法,也可以根据业务需求调整数据库的NLS_TWO_DIGIT_CENTURY_BOUNDARY参数修改分界年阈值。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

