ORA-01841: (полный) год должен быть ... не должен быть 0. Как воспроизвести и исправить? - PullRequest
0 голосов
/ 02 ноября 2018

извините за вопрос, который имеет много ответов на Stackoverflow и позволяет мне поставить этот вопрос в моем контексте, который может отличаться от предыдущих вопросов.

Я нахожусь в производственной базе данных, где я не могу изменить данные. Данные, поступающие в эту базу данных, очень динамичны, они постоянно меняются, что затрудняет воспроизведение этой ошибки. Я получаю доступ к Oracle 11g через JDBC (Java).

Хорошо, для моего УДАЛЕНИЯ я получаю

ORA-01841: (full) year must be between -4713 and +9999, and not be 0. 

Это моя таблица (упрощенно):

MY_TABLE 
Name                         Null?    Type                        
---------------------------- -------- --------------------------- 
MYTIMESTAMP                  NOT NULL TIMESTAMP(6) WITH TIME ZONE

Время от времени я получаю ORA-01841 для этого УДАЛЕНИЯ:

delete from MY_TABLE where MYTIMESTAMP < sysdate - 30

Когда я смотрю данные, все выглядит нормально. Итак, где мне нужна идея:

1) Как вставить неверную метку времени в MY_TABLE, чтобы воспроизвести эту ошибку? (*)

2) Как я могу переписать оператор DELETE, чтобы не потерпеть неудачу? Обратите внимание, я не могу изменить существующие данные в Oracle.

Спасибо

(*) Я пытался вставить эти «недействительные» даты, но, увы, недостаточно недействительными:

insert into MY_TABLE (MY_IMESTAMP) values ('31-DEC-9999 11:00:00 PM +2:00')
insert into MY_TABLE (MY_IMESTAMP) values ('31-DEC-0 11:00:00 PM +2:00')

1 Ответ

0 голосов
/ 03 ноября 2018

Я часто вижу эту ошибку, когда происходят неявные преобразования типов. Можете ли вы попробовать:

delete from MY_TABLE where MYTIMESTAMP < systimestamp - interval '30' day
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...