解决oracle数据库的表中存在异常日期值在查询时抛出ora-01841错误的办法
生产环境的服务器上,在查询时抛出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错误的办法相关推荐
- oracle修改某表中的顺序,oracle 数据库 , 表中字段顺序修改
1.首先需要sys或者system权限操作 2.查询需要更改的表的ID select object_id from all_objects where owner = '用户名' and object ...
- oracle杀死进程时权限不足_如何解决Oracle数据库在迁移过程中的权限不足问题
第一部分 背景 这段时间一直在忙某系统IT基础架构的整合,我负责进行数据库整合,要把一系统迁移集中到另外小机数据库中.环境描述如下: 源数据库:Oracle10.2.0.2 for sap,字符集是U ...
- oracle数据库的表中添加表字段和删除表字段
添加Oracle表字段 alter table <table_name> add <column_name> <数据类型和约束条件>; 删除Oracle表字段 al ...
- oracle数据库向表中新增字段以及插入一行数据
一.新增字段: alter table 表名 add(字段名,字段类型); 例: alter table bi_trade_info add(LEAGUER_TYPE NUMBER(1)); 二.修改 ...
- Oracle数据库删除表中的某一个字段
alter table 表名 drop column 字段名(即列名); alter table exam_log drop column area_code; alter table exam_lo ...
- 删除数据库的表中某字段的值《转》
方法一: update 表名 set 字段名=NULL 方法二: update 表名 set 字段名='' 转载于:https://www.cnblogs.com/LceMeaning/p/34157 ...
- oracle两个表数据比较,oracle数据库两表数据比较
1 引言 在程序设计的过程中,往往会遇到两个记录集的比较.如华东电网PMS接口中实现传递一天中变更(新增.修改.删除)的数据.实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等 ...
- oracle删除表的一个字段的数据库,学会Oracle数据库删除表字段和Oracle数据库表增加字段方法...
Oracle数据库添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-.); Ora ...
- oracle中12560,如何解决Oracle数据库ORA-12560错误问题
如何解决Oracle数据库ORA-12560错误问题 发布时间:2020-07-28 10:16:24 来源:亿速云 阅读:77 作者:小猪 栏目:数据库 这篇文章主要为大家展示了如何解决Oracle ...
最新文章
- 我们是否正在进入第四代人工智能?
- 马云口中的“计划经济”其实是一种大数据和人工智能
- 使用NuGet下载旧版本的软件包
- LeetCode-166- Fraction to Recurring Decimal
- gin获取post参数
- PE学习(二) IMAGE_DOS_HEADER
- Distribution is all you need:这里有12种做ML不可不知的分布
- 认识Hibernate
- Sublime 常用操作
- tp5 mysql异常捕获_tp5 ThinkPhp5 自定义异常处理类
- 幸运抽奖游戏系统带后台源码
- linux下的MBR(msdos)分区与格式化----fdisk mkfs
- geotiff.js的初步使用
- 如何用微信公众号二维码事件做扫码登陆
- JUC源码分析16-集合-ConcurrentSkipListMap、ConcurrentSkipListSet
- 史上最全的数学建模竞赛介绍,大家不要错过哦!!!
- 小学生python游戏编程arcade----动画图片实现爆炸效果
- html动画(1)大白
- Allegro添加Logo方法
- apple configurator 2 提取ipa文件
热门文章
- LogicalDOC8.0导入远程文件数量限制
- Cisco交换机端口假死(err-disable)解决方法
- MATLAB离散傅里叶变换实验结果分析,Matlab离散傅里叶变换实验报告.doc
- 食堂自动化管理系统C语言,C语言实现食堂就餐管理系统(带链表)
- phpStrom+google谷歌浏览器+debug断点调试php程序
- 2018年最受黑客欢迎的12款操作系统
- 软件编程走火入魔之:程序对人身心的残忍摧残
- I帧 B帧 p帧 IDR帧的区别
- 从零开始创建react+Django项目
- win10使用cmd强制删除文件命令