Oracle 10.2.0.5
Какой самый простой способ определить строки в таблице, которые имеют "недопустимые" значения в столбцах DATE. Под "недопустимыми" здесь я имею в виду двоичное представление, которое нарушает правила Oracle для значений даты.
Недавно у меня возникла проблема с недопустимой датой, хранящейся в столбце.
Я смог использовать предикат запроса, чтобы найти конкретную проблемную строку:
WHERE TO_CHAR(date_expr,'YYYYMMDDHH24MISS') = '00000000000000'
В моем случае байт века был недействительным...
select dump(h.bid_close_date) from mytable h where h.id = 54321
Typ=12 Len=7: 220,111,11,2,1,1,1
Байт века должен быть 100 + двузначное число века. В данном случае было добавлено еще 100, как если бы значение века было "120", что делало год "12011". (Единственный известный мне способ получить недействительные значения DATE в базу данных - использовать OCI, используя родное 7-байтовое представление DATE.)
В этом случае функция TO_CHAR вернула идентифицируемую строку, которую я мог использовать для идентификации нестандартного значения DATE.
Мой вопрос: существует ли более общий или простой подход (желательно с использованием оператора SQL SELECT) для идентификации строк с "недопустимыми" значениями в столбцах DATE.
Я имел SQL Error: ORA-01841: (full) year must be between -4713 and +9999, and not be 0
01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0"
.
Так для идентификации строк, которые имели плохую дату, я сделал следующее.
declare
cursor mydates is select table_pk, your_date_col from table;
c_date table.your_date_col%type;
c_pk table.table_pk%type;
testrow table.your_date_col%type;
begin
open mydates;
loop
begin
fetch mydates into c_pk, c_date;
exit when mydates%notfound;
testrow := TO_TIMESTAMP(c_date,'YYYY-MM-DD HH24:MI:SS');
exception when others then
dbms_output.put_line('bad file: ' || c_pk);
end;
end loop;
close mydates;
end;
, Таким образом, все, что я сделал, было, создают курсор, цикл через элементы и протестировал каждого, и отобразите идентификатор, таким образом, я мог легко найти плохие строки.