生产环境的服务器上,在查询时抛出SQLDataException,错误代码为ora-01841

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

经排查是在rs.next()语句中报错,导致后面的数据不能正常读取和显示,经多方判断,只能判断是表中的某个日期列被保存了一个异常日期值,在PLSQL中使用日期列排序时也会抛出此异常,表中的数据量也比较多,有十几万,无法精确的定位是哪一行数据的日期列有问题,网上也查不到相应的解决方案,后来无意中使用to_char函数查询年份

select distinct to_char(dt_column, 'yyyy') from tbl 

居然可以查询出结果,结果集中显示有数据的年份为0000,故基本上可以判断是存在年份为0的数据引起的异常,下面尝试使用以下SQL语句对数据进行校正

update em_t_equ$detail t set t.DT_REPLACE_DATE=null where to_char(t.DT_REPLACE_DATE,'yyyy')='0000'
or to_number(to_char(t.DT_REPLACE_DATE,'yyyy'))>9999 or to_number(to_char(t.DT_REPLACE_DATE,'yyyy'))<-1000;

执行后居然成功了,没有报错,为了保证将所有数据列的错误值都进行校正,可以使用SQL语句查出此表的所有日期类型的列名,然后结合excel,自动生成多个SQL语句

select * from user_tab_columns t where t.TABLE_NAME='EM_T_EQU$DETAIL' and data_type='DATE'

结果集:

EM_T_EQU$DETAIL    DT_REPLACE_DATE    DATE
EM_T_EQU$DETAIL    DT_NEXT$REPLACE$DATE    DATE
EM_T_EQU$DETAIL    DT_CS    DATE
EM_T_EQU$DETAIL    DT_USE_LIFE    DATE
EM_T_EQU$DETAIL    DT_LM_DATE    DATE
EM_T_EQU$DETAIL    DT_MIDDLE_DATE    DATE
EM_T_EQU$DETAIL    DT_BIG_DATE    DATE
EM_T_EQU$DETAIL    DT_NEXT$CHECK$DATE    DATE
EM_T_EQU$DETAIL    DT_NEXT$MIDDLE$DATE    DATE
EM_T_EQU$DETAIL    DT_NEXT$BIG$DATE    DATE
EM_T_EQU$DETAIL    DT_FACTORY_DATE    DATE
EM_T_EQU$DETAIL    DT_CHECK_DATE    DATE
EM_T_EQU$DETAIL    DT_EQU$USE$DATE    DATE
EM_T_EQU$DETAIL    DT_DATE    DATE

在PLSQL中可以单独复制第2列,粘贴到Excel中,在后面的单元格上填写公式:

="update em_t_equ$detail t set t."&I2&"=null where to_char(t."&I2&",'yyyy')='0000' or to_number(to_char(t."&I2&",'yyyy'))>9999 or to_number(to_char(t."&I2&",'yyyy'))<-1000;"

鼠标下拉复制,生成多个SQL语句,复制后在PLSQL中粘贴执行即可

update em_t_equ$detail t set t.DT_REPLACE_DATE=null where to_char(t.DT_REPLACE_DATE,'yyyy')='0000' or to_number(to_char(t.DT_REPLACE_DATE,'yyyy'))>9999 or to_number(to_char(t.DT_REPLACE_DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_NEXT$REPLACE$DATE=null where to_char(t.DT_NEXT$REPLACE$DATE,'yyyy')='0000' or to_number(to_char(t.DT_NEXT$REPLACE$DATE,'yyyy'))>9999 or to_number(to_char(t.DT_NEXT$REPLACE$DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_CS=null where to_char(t.DT_CS,'yyyy')='0000' or to_number(to_char(t.DT_CS,'yyyy'))>9999 or to_number(to_char(t.DT_CS,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_USE_LIFE=null where to_char(t.DT_USE_LIFE,'yyyy')='0000' or to_number(to_char(t.DT_USE_LIFE,'yyyy'))>9999 or to_number(to_char(t.DT_USE_LIFE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_LM_DATE=null where to_char(t.DT_LM_DATE,'yyyy')='0000' or to_number(to_char(t.DT_LM_DATE,'yyyy'))>9999 or to_number(to_char(t.DT_LM_DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_MIDDLE_DATE=null where to_char(t.DT_MIDDLE_DATE,'yyyy')='0000' or to_number(to_char(t.DT_MIDDLE_DATE,'yyyy'))>9999 or to_number(to_char(t.DT_MIDDLE_DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_BIG_DATE=null where to_char(t.DT_BIG_DATE,'yyyy')='0000' or to_number(to_char(t.DT_BIG_DATE,'yyyy'))>9999 or to_number(to_char(t.DT_BIG_DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_NEXT$CHECK$DATE=null where to_char(t.DT_NEXT$CHECK$DATE,'yyyy')='0000' or to_number(to_char(t.DT_NEXT$CHECK$DATE,'yyyy'))>9999 or to_number(to_char(t.DT_NEXT$CHECK$DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_NEXT$MIDDLE$DATE=null where to_char(t.DT_NEXT$MIDDLE$DATE,'yyyy')='0000' or to_number(to_char(t.DT_NEXT$MIDDLE$DATE,'yyyy'))>9999 or to_number(to_char(t.DT_NEXT$MIDDLE$DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_NEXT$BIG$DATE=null where to_char(t.DT_NEXT$BIG$DATE,'yyyy')='0000' or to_number(to_char(t.DT_NEXT$BIG$DATE,'yyyy'))>9999 or to_number(to_char(t.DT_NEXT$BIG$DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_FACTORY_DATE=null where to_char(t.DT_FACTORY_DATE,'yyyy')='0000' or to_number(to_char(t.DT_FACTORY_DATE,'yyyy'))>9999 or to_number(to_char(t.DT_FACTORY_DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_CHECK_DATE=null where to_char(t.DT_CHECK_DATE,'yyyy')='0000' or to_number(to_char(t.DT_CHECK_DATE,'yyyy'))>9999 or to_number(to_char(t.DT_CHECK_DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_EQU$USE$DATE=null where to_char(t.DT_EQU$USE$DATE,'yyyy')='0000' or to_number(to_char(t.DT_EQU$USE$DATE,'yyyy'))>9999 or to_number(to_char(t.DT_EQU$USE$DATE,'yyyy'))<-1000;
update em_t_equ$detail t set t.DT_DATE=null where to_char(t.DT_DATE,'yyyy')='0000' or to_number(to_char(t.DT_DATE,'yyyy'))>9999 or to_number(to_char(t.DT_DATE,'yyyy'))<-1000;

解决oracle数据库的表中存在异常日期值在查询时抛出ora-01841错误的办法相关推荐

  1. oracle修改某表中的顺序,oracle 数据库 , 表中字段顺序修改

    1.首先需要sys或者system权限操作 2.查询需要更改的表的ID select object_id from all_objects where owner = '用户名' and object ...

  2. oracle杀死进程时权限不足_如何解决Oracle数据库在迁移过程中的权限不足问题

    第一部分 背景 这段时间一直在忙某系统IT基础架构的整合,我负责进行数据库整合,要把一系统迁移集中到另外小机数据库中.环境描述如下: 源数据库:Oracle10.2.0.2 for sap,字符集是U ...

  3. oracle数据库的表中添加表字段和删除表字段

    添加Oracle表字段 alter table <table_name> add <column_name> <数据类型和约束条件>; 删除Oracle表字段 al ...

  4. oracle数据库向表中新增字段以及插入一行数据

    一.新增字段: alter table 表名 add(字段名,字段类型); 例: alter table bi_trade_info add(LEAGUER_TYPE NUMBER(1)); 二.修改 ...

  5. Oracle数据库删除表中的某一个字段

    alter table 表名 drop column 字段名(即列名); alter table exam_log drop column area_code; alter table exam_lo ...

  6. 删除数据库的表中某字段的值《转》

    方法一: update 表名 set 字段名=NULL 方法二: update 表名 set 字段名='' 转载于:https://www.cnblogs.com/LceMeaning/p/34157 ...

  7. oracle两个表数据比较,oracle数据库两表数据比较

    1 引言 在程序设计的过程中,往往会遇到两个记录集的比较.如华东电网PMS接口中实现传递一天中变更(新增.修改.删除)的数据.实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等 ...

  8. oracle删除表的一个字段的数据库,学会Oracle数据库删除表字段和Oracle数据库表增加字段方法...

    Oracle数据库添加字段的语法:alter table tablename add (column datatype [default  value][null/not null],-.); Ora ...

  9. oracle中12560,如何解决Oracle数据库ORA-12560错误问题

    如何解决Oracle数据库ORA-12560错误问题 发布时间:2020-07-28 10:16:24 来源:亿速云 阅读:77 作者:小猪 栏目:数据库 这篇文章主要为大家展示了如何解决Oracle ...

最新文章

  1. 我们是否正在进入第四代人工智能?
  2. 马云口中的“计划经济”其实是一种大数据和人工智能
  3. 使用NuGet下载旧版本的软件包
  4. LeetCode-166- Fraction to Recurring Decimal
  5. gin获取post参数
  6. PE学习(二) IMAGE_DOS_HEADER
  7. Distribution is all you need:这里有12种做ML不可不知的分布
  8. 认识Hibernate
  9. Sublime 常用操作
  10. tp5 mysql异常捕获_tp5 ThinkPhp5 自定义异常处理类
  11. 幸运抽奖游戏系统带后台源码
  12. linux下的MBR(msdos)分区与格式化----fdisk mkfs
  13. geotiff.js的初步使用
  14. 如何用微信公众号二维码事件做扫码登陆
  15. JUC源码分析16-集合-ConcurrentSkipListMap、ConcurrentSkipListSet
  16. 史上最全的数学建模竞赛介绍,大家不要错过哦!!!
  17. 小学生python游戏编程arcade----动画图片实现爆炸效果
  18. html动画(1)大白
  19. Allegro添加Logo方法
  20. apple configurator 2 提取ipa文件

热门文章

  1. LogicalDOC8.0导入远程文件数量限制
  2. Cisco交换机端口假死(err-disable)解决方法
  3. MATLAB离散傅里叶变换实验结果分析,Matlab离散傅里叶变换实验报告.doc
  4. 食堂自动化管理系统C语言,C语言实现食堂就餐管理系统(带链表)
  5. phpStrom+google谷歌浏览器+debug断点调试php程序
  6. 2018年最受黑客欢迎的12款操作系统
  7. 软件编程走火入魔之:程序对人身心的残忍摧残
  8. I帧 B帧 p帧 IDR帧的区别
  9. 从零开始创建react+Django项目
  10. win10使用cmd强制删除文件命令