Sql --ORA-01873:间隔的前导精度太小

Sql --ORA-01873:间隔的前导精度太小,sql,oracle,Sql,Oracle,我遇到了ORA-01873:区间的前导精度太小的问题,发现我表中的一些值超过了numtodsinterval()的最大值2147483647000 从qrtz_触发器中选择* 其中触发器类型='SIMPLE' 和 SYS_EXTRACT_UTC(时间戳'1970-01-01 00:00:00-03:00')+NUMTODSINTERVAL(结束时间/1000,'秒')您可以添加一个过滤器: where trigger_type = 'SIMPLE' and end_time < power

我遇到了ORA-01873:区间的前导精度太小的问题,发现我表中的一些值超过了numtodsinterval()的最大值2147483647000

从qrtz_触发器中选择*
其中触发器类型='SIMPLE'
和

SYS_EXTRACT_UTC(时间戳'1970-01-01 00:00:00-03:00')+NUMTODSINTERVAL(结束时间/1000,'秒')您可以添加一个过滤器:

where trigger_type = 'SIMPLE'
and end_time < power(2, 31) * 1000
and
SYS_EXTRACT_UTC ...
顺便说一句,您在这里使用的
sys\u extract\u utc
很奇怪;您指定的时间偏移量为3小时,然后转换回UTC,此时您可以首先指定UTC时间:

TIMESTAMP '1970-01-01 00:00:00.00 UTC'
  + NUMTODSINTERVAL (least(end_time / 1000, power(2, 31) - 1), 'SECOND')
但是,在比较和筛选之前,比较必须将表中的每个值转换为时间戳,这将阻止使用索引(除非已经有基于函数的索引,这在转换失败时似乎不太可能)。将目标时间(未来7天)转换为历元数,然后将列值与该历元数进行比较会更有效:

select * from qrtz_triggers 
where trigger_type = 'SIMPLE'
and end_time <= 1000 * (
  select 24 * 60 * 60 * extract (day from i)
   + 60 * 60 * extract (hour from i)
   + 60 * extract (minute from i)
   + extract (second from i)
  from (
    select SYSTIMESTAMP + INTERVAL '7' DAY - TIMESTAMP '1970-01-01 00:00:00.00 UTC' as i
    from dual
  )
)
从qrtz_触发器中选择*
其中触发器类型='SIMPLE'

结束时间你可以用这个:

select * 
from qrtz_triggers 
where trigger_type = 'SIMPLE'
and
TIMESTAMP '1970-01-01 00:00:00.00 UTC' + 8842852800000 /1000/60/60/24 * INTERVAL '1' DAY <= SYSTIMESTAMP + INTERVAL '7' DAY
选择*
从qrtz_触发器
其中触发器类型='SIMPLE'
和

时间戳“1970-01-01 00:00:00.00 UTC”+8842852800000/1000/60/60/24*间隔“1”天您可以在值上添加该筛选器,但在大小写表达式中处理它们更可靠,这样您可以控制何时对其求值。那些非常大的值应该代表什么日期?真的是2250吗你想如何使用/解释它们?(同时:)或者如果您的结束时间列已编制索引,则将目标时间(现在+7天)转换为历元数将更为有效,这样既可以避免转换问题,又更为有效。为什么
SYS\u EXTRACT\u UTC(时间戳'1970-01-01 00:00:00.00-03:00')
?只需使用时间戳“1970-01-01 00:00:00.00 UTC”
select * from qrtz_triggers 
where trigger_type = 'SIMPLE'
and end_time <= 1000 * (
  select 24 * 60 * 60 * extract (day from i)
   + 60 * 60 * extract (hour from i)
   + 60 * extract (minute from i)
   + extract (second from i)
  from (
    select SYSTIMESTAMP + INTERVAL '7' DAY - TIMESTAMP '1970-01-01 00:00:00.00 UTC' as i
    from dual
  )
)
select * 
from qrtz_triggers 
where trigger_type = 'SIMPLE'
and
TIMESTAMP '1970-01-01 00:00:00.00 UTC' + 8842852800000 /1000/60/60/24 * INTERVAL '1' DAY <= SYSTIMESTAMP + INTERVAL '7' DAY