我猜您varchar2
专栏中的日期之一 - 请注意不一致之处 - 不是您指定的格式。请不要将日期存储在字符列中。使用日期列,它根本不会发生这种情况。
创建以下函数:
create or replace function is_date
( Pdate varchar2
, Pformatstring varchar2 ) return number is
l_date date;
begin
l_date := to_date(Pdate, Pformatstring);
return 1;
-- raise an exception when you can-t convert to a date.
exception when others then
return 0;
end;
然后在你的桌子上跑:
select <columns>
from my_table
where is_date(textfield, 'mm/dd/rrrr') = 0
这将向您显示您的数据错误的地方。
如评论中所述,由于您没有选择所有数据,因此最初似乎运行良好。
还有另一种选择,尽管仍然与将日期存储为字符有关。如果您正在执行复杂的联接,则如下所示:
select a.a, a.b
from my_table a
join another_table b
on to_date(replace(a.textfield,'?'),'mm/dd/rr') = b.a_date
那么 Oracle 不一定会按照您想要的顺序评估所有内容。您必须将其更改为:
select x.*
from ( select a, b, to_date(replace(a.textfield,'?'),'mm/dd/rr') as another_date
from my_table ) x
join another_table b
on another_date = b.a_date