错误信息
【汉】ORA-01841:(完整)年份值必须介于-4713和+9999之间,且不为0
【英】ORA-01841: (full) year must be between -4713 and +9999, and not be 0
序
在使用to_date函数进行sql查询时报错。
故
在Oracle中,时间格式中的年份被限制为-4713到+9999。
此问题多数情况下会在使用to_date函数将字符串类型的数据转成时间类型时出现。仔细想一下,时间类型的字段会直接拒绝你插入非正常的时间格式和内容,但字符类型就不会限制,这也就导致了在将某些非时间格式(或非正常时间数据)的字符转换成时间时,抛出各种错误。
在本案例中,主要是由于字符串类型的字段中的某个(或某些)数据的年份不符合Oracle的正常时间数据,所以抛出了错误。
解
既然知道了问题的原因是字符类型的字段中有不在Oracle标准年份的数据,那么我们将其找出来就可以了。
查找脏数据
由于我是使用to_date(a,'yyyy-mm-dd')格式化格式,那么我只要将第一个-前面的截取出来,然后再排除-4713到+9999的数据,就能得到相应的脏数据。
select substr(a,1,instr(a,'-')-1) from testa
从图中可以看出,经过函数转换后得到年份是0000,不符合Oracle的正常年份范围。
解决
既然已经找到脏数据了,那么就需要清理这个(或这些)数据了。
清理的办法有两种,要么将不符合的数据给清除,要么将其过滤。具体如何去做,就需要结合业务逻辑去选择了。
评论区