我正在处理Oracle 10g数据库中的一些数据,特别是批量更新和读取时间戳信息。由于业务需求,我必须从MM/DD/YYYY HH24:MI:SS
格式转换为YYYY-MM-DD HH24:MI:SS
格式。同样,由于业务需求,时间戳存储为VARCHAR
而不是本机日期时间。
不幸的是,现在我无法在我的数据上运行select操作。
具体来说,当我运行以下选项时,我会收到ORA-01861:Literal与格式字符串不匹配:
SELECT datetime_stamp
from entrytable
where
to_date(datetime_stamp, 'YYYY-MM-DD HH24:MI:SS')
between
TO_DATE('11/27/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS')
and
TO_DATE('12/06/2011 23:59:59', 'MM/DD/YYYY HH24:MI:SS')
and rownum < 1000
我确认错误的参数是to_date(datetime_stamp,'YYYY-MM-DD HH24:MI:SS'),但现在我要解析400k行数据以尝试查找坏行。
有什么方法可以让Oracle返回产生ORA-01861错误的行?
我尝试使用REGEXP_LIKE查找不适合的数据[0-9] [0-9] [0-9] [0-9] - [0-9] [0-9] - [0 -9] [0-9] [0-9] [0-9]:[0-9] [0-9]:[0-9] [0-9],但所有行似乎都符合正则表达式
答案 0 :(得分:4)
create function td(s varchar2) return number is
begin
if to_date(s, 'YYYY-MM-DD HH24:MI:SS') is not null then return 1; end if;
return null;
exception
when others then return 0;
end;
然后
select datetime_stamp from entrytable where td(datetime_stamp) = 0
答案 1 :(得分:1)
哇,这是一个可怕的论据。没有业务要求应该强迫数据库开发人员使用VARCHAR来存储日期。这必须来自设计此架构的人的无知或懒惰。如果您不能定义为日期,那么它不是日期,而是一串数字和符号,可能会或可能不会确认任何格式。更不用说没有做任何日期功能,比较等。不好!!!时间戳存储为VARCHAR而不是原始日期时间 业务要求
无论如何,我会说与项目经理或任何人一起升级此问题,并将其更改为更改日期或时间戳。如果你试图动态转换to_date,即使你清理VARCHAR字段,你肯定会再次遇到这种情况。
现在尝试正确修复它,而不是弄乱清理字符串。