2011-12-07 53 views
0

我正在使用Oracle 10g数据库中的一些数据,特别是批量更新和读取时间戳记信息。由于业务需求,我必须将MM/DD/YYYY HH24:MI:SS格式转换为YYYY-MM-DD HH24:MI:SS格式。另外,由于业务需求,时间戳存储为VARCHAR而不是本机日期时间。在Oracle 10g中查找错误的日期时间标记

不幸的是,现在我遇到了麻烦在我的数据上运行选择操作。

具体而言,当我运行下面的选择,我收到ORA-01861:那不好的说法是TO_DATE(datetime_stamp,“YYYY-MM-DD HH24

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 

我证实:文字不匹配格式字符串: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

下面的函数应该这样做。但是,在时间戳/日期数据类型中存储时间戳/日期会更好。它会为你省去这个麻烦。 – Ben

+0

希望我能奔...希望我能。 – Gyrfalcon2138

回答

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 
+0

嗨哈尔 - 我试图复制和粘贴你的代码到我的Oracle资源管理器中,并得到'ORA-00900:无效的SQL语句;交易被回滚了。'我不确定如何解决问题。我有充分的权利,但我的oracle控制台有点奇怪 - 例如,我知道它不能很好地处理游标。你认为这可能是一个试图定义函数的问题吗? – Gyrfalcon2138

+0

尝试使用SQL Developer或SQL * Plus创建函数 –

+0

+1,'create或replace function'会更好,如果它在SQL * Plus中运行,则在'end;'后面需要'/'。 – Ben

1

时间戳存储为VARCHAR,而不是本机的日期时间,由于 业务需求

哇,这样做的一个可怕的说法。没有业务需求应该迫使数据库开发人员使用VARCHAR来存储日期。这必须来自设计该模式的人的无知或懒惰。如果您不能将日期定义为日期,那么它不是日期,而是一串数字和符号,它们可能根据任何格式确定,也可能不符合任何格式。更不用说做任何日期功能,比较等的损失。不好!

无论如何,我会说与项目经理或任何人升级这个问题,并将其优先更改为日期或时间戳。如果您试图即时转换to_date,即使清理了VARCHAR字段,您也会再次遇到这种情况。

尝试正确地修复它,而不是乱搞清理字符串。

+0

问题是,大多数列都是通用列,可以由系统管理员定义为某些数据类型。所以这个datetime_stamp列实际上可以是一个整数值,一个字符串或任何东西。我正在按照设计使用产品,并且没有能力更改数据库的模式。 – Gyrfalcon2138

+0

ahhhh,停下来,你杀了我......真的。有些“天才”认为这将是最好的“通用”,所以现在你不知道wtf在那里。毕竟,数据库只是我们称之为“数据”的“东西”的一个愚蠢的倾销地。啊。对不起,但它仍然没有任何借口让它向前迈进。祝你好运。 – someuser2

+0

我认为我们的目标是创建一个可以为特定客户定制的产品,而无需每次重建架构。这在某种程度上是有道理的,但我通常是一个MSSQL人员,Oracle似乎很挑剔 - 尤其是关于日期戳。 – Gyrfalcon2138