在Oracle 10g中查找错误的日期时间戳

时间:2011-12-07 14:51:16

标签: oracle datetime

我正在处理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],但所有行似乎都符合正则表达式

2 个答案:

答案 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字段,你肯定会再次遇到这种情况。

现在尝试正确修复它,而不是弄乱清理字符串。