Как определить недействительные (поврежденные) значения, хранящиеся в столбцах Oracle DATE

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.

13
задан spencer7593 22 June 2012 в 00:03
поделиться

1 ответ

Я имел 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;

, Таким образом, все, что я сделал, было, создают курсор, цикл через элементы и протестировал каждого, и отобразите идентификатор, таким образом, я мог легко найти плохие строки.

0
ответ дан 2 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: