侧边栏壁纸
博主头像
与晚风述往事博主等级

万般皆下品,唯有读书高。

  • 累计撰写 149 篇文章
  • 累计创建 29 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

ORA-01841:(完整)年份值必须介于-4713和+9999之间,且不为0

与晚风述往事
2021-12-13 / 0 评论 / 0 点赞 / 4,298 阅读 / 653 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-12-13,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

错误信息

【汉】ORA-01841:(完整)年份值必须介于-4713和+9999之间,且不为0
【英】ORA-01841: (full) year must be between -4713 and +9999, and not be 0

在使用to_date函数进行sql查询时报错。
image.png

在Oracle中,时间格式中的年份被限制为-4713到+9999。

 此问题多数情况下会在使用to_date函数将字符串类型的数据转成时间类型时出现。仔细想一下,时间类型的字段会直接拒绝你插入非正常的时间格式和内容,但字符类型就不会限制,这也就导致了在将某些非时间格式(或非正常时间数据)的字符转换成时间时,抛出各种错误。
 在本案例中,主要是由于字符串类型的字段中的某个(或某些)数据的年份不符合Oracle的正常时间数据,所以抛出了错误。

既然知道了问题的原因是字符类型的字段中有不在Oracle标准年份的数据,那么我们将其找出来就可以了。

查找脏数据

由于我是使用to_date(a,'yyyy-mm-dd')格式化格式,那么我只要将第一个-前面的截取出来,然后再排除-4713到+9999的数据,就能得到相应的脏数据。

select substr(a,1,instr(a,'-')-1) from testa

image.png
从图中可以看出,经过函数转换后得到年份是0000,不符合Oracle的正常年份范围。

解决

既然已经找到脏数据了,那么就需要清理这个(或这些)数据了。
清理的办法有两种,要么将不符合的数据给清除,要么将其过滤。具体如何去做,就需要结合业务逻辑去选择了。

0

评论区