0

ここに私が使用しているクエリがあります

select * from (
select table_name, to_number(to_char(trunc(to_date(substr(table_name,instr(table_name,'_',-1,2)+1,8),'yyyymmdd')),'J')) as t_date, to_number(to_char(trunc(sysdate),'J')) as s_date
  from user_tables
 where table_name like 'WORLD_RI%' and table_name not like 'WORLD_RI_ERROR%' )
where t_date < s_date;

私は得る

ORA-01841: (完全な) 年は -4713 から +9999 の間である必要があり、0 であってはなりません

最後の where 句 ( where t_date < s_date) を含めるとエラーが発生します。また、参考までに、table_name は通常WORLD_RI_1234_20120301_1.

任意のヘルプや提案をいただければ幸いです。

4

2 に答える 2

1

この部分だけを実行することをお勧めします

select table_name
, substr(table_name,instr(table_name,'_',-1,2)+1,8) as t_date
from user_tables
where table_name like 'WORLD_RI%' 
and table_name not like 'WORLD_RI_ERROR%'

次に、データ内の奇妙な値を手動で確認します

編集:

その部分が機能する場合-次にこの部分を試してください

select table_name
, to_date(substr(table_name,instr(table_name,'_',-1,2)+1,8),'yyyymmdd')   
from user_tables
where table_name like 'WORLD_RI%' 
and table_name not like 'WORLD_RI_ERROR%'
于 2012-04-17T11:46:00.820 に答える
0

取れたと思います!!

このコードは魅力のように機能します。日付文字列に翻訳を 1 つ追加するとうまくいきました。皆様のご協力に感謝いたします。

select * from (
select table_name , to_date(substr(table_name,instr(table_name,'_',-1,2)+1,8),'yyyymmdd') as T_DATE , trunc(sysdate) s_date
  from user_tables
 where table_name like 'WORLD_RI%' and table_name not like 'WORLD_RI_ERROR%'
   and translate(substr(table_name,instr(table_name,'_',-1,2)+1,8),'0123456789','$$$$$$$$$$') = '$$$$$$$$'
) where T_DATE < s_date ;
于 2012-04-18T06:49:23.400 に答える