Oracle ORA-01841:(全年)必须。。。不是0。如何复制和修复?

Oracle ORA-01841:(全年)必须。。。不是0。如何复制和修复?,oracle,oracle11g,Oracle,Oracle11g,很抱歉提出一个问题,关于Stackoverflow有很多答案,请允许我在我的上下文中提出这个问题,这可能与前面的问题不同 我在生产数据库中,无法更改数据。进入这个数据库的数据是高度动态的,它随时都在变化,因此很难重现这个错误。我正在通过JDBC(Java)访问Oracle 11g 好的,对于我的删除,我得到 ORA-01841: (full) year must be between -4713 and +9999, and not be 0. 这是我的桌子(简体): 我不时会收到此删除的O

很抱歉提出一个问题,关于Stackoverflow有很多答案,请允许我在我的上下文中提出这个问题,这可能与前面的问题不同

我在生产数据库中,无法更改数据。进入这个数据库的数据是高度动态的,它随时都在变化,因此很难重现这个错误。我正在通过JDBC(Java)访问Oracle 11g

好的,对于我的删除,我得到

ORA-01841: (full) year must be between -4713 and +9999, and not be 0. 
这是我的桌子(简体):

我不时会收到此删除的ORA-01841:

delete from MY_TABLE where MYTIMESTAMP < sysdate - 30

当隐式类型转换正在进行时,我经常看到这个错误。你可以试试:

delete from MY_TABLE where MYTIMESTAMP < systimestamp - interval '30' day
从MY_表中删除,其中MYTIMESTAMP
听起来您的数据可能已损坏?奇怪的是,它是间歇性的,除非有其他过滤器,并且它是一致的,这取决于这些值。当问题发生时,有趣的是查看
dump()
显示的内容,以及更改为
时MYTIMESTAMP避免隐式转换(
systimestamp-间隔“30”天
)。是的,听起来不错。我试试看。谢谢。另外需要检查的是是否有触发器实际引发了错误,可能是因为它进行了其他转换,可能依赖于NLS设置。所以不一定与实际的时间戳相关。您可能能够从错误堆栈中分辨出来;我不确定JDBC向您展示了多少…如果您不关心时间部分,可以尝试trunc dates。看看你是否仍然得到错误。谢谢。这周我会试试的。不幸的是,我无法亲自尝试(无法直接访问该数据库)并立即“接受”这个答案。
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')
delete from MY_TABLE where MYTIMESTAMP < systimestamp - interval '30' day