Oracle 动态排除每小时加载前5分钟的数据

Oracle 动态排除每小时加载前5分钟的数据,oracle,datetime,timestamp,where-clause,sysdate,Oracle,Datetime,Timestamp,Where Clause,Sysdate,从下面的“索赔人”表中提取数据以加载到另一个表中。这种情况每小时发生一次(早上6点、7点、8点等) 假设我需要编写一个WHERE子句,在每次执行上述操作时,该子句将前5分钟的数据从加载中排除。where子句将添加到处理该操作的整个脚本中 我已经试过了,但是它排除了0条记录,所以它没有检测到“归档日期”的每分钟差异 编写where子句以排除需要排除的数据的正确方法是什么 原始谓词的开始时间和结束时间不同步。如果在2:00(sysdate)运行查询,则范围的开始时间为sysdate(2:00),结束

从下面的“索赔人”表中提取数据以加载到另一个表中。这种情况每小时发生一次(早上6点、7点、8点等)

假设我需要编写一个WHERE子句,在每次执行上述操作时,该子句将前5分钟的数据从加载中排除。where子句将添加到处理该操作的整个脚本中

我已经试过了,但是它排除了0条记录,所以它没有检测到“归档日期”的每分钟差异

编写where子句以排除需要排除的数据的正确方法是什么


原始谓词的开始时间和结束时间不同步。如果在2:00(sysdate)运行查询,则范围的开始时间为sysdate(2:00),结束时间为TRUNC(sysdate,'HH24')+间隔'5'分钟)或2:05。如果您在14:05之后运行查询,那么您的开始时间实际上将在结束时间之后

select to_date('2021-03-03 14:00','YYYY-MM-DD HH24:MI') query_date, 
to_date('2021-03-03 14:00','YYYY-MM-DD HH24:MI') start_time,
(trunc(to_date('2021-03-03 14:00','YYYY-MM-DD HH24:MI'),'HH24') + interval '5' minute) stop_time
from dual
union
select to_date('2021-03-03 14:10','YYYY-MM-DD HH24:MI') query_date, 
to_date('2021-03-03 14:10','YYYY-MM-DD HH24:MI') start_time,
(trunc(to_date('2021-03-03 14:10','YYYY-MM-DD HH24:MI'),'HH24') + interval '5' minute) stop_time
from dual;
结果:

QUERY_DATE           START_TIME           STOP_TIME            
-------------------- -------------------- -------------------- 
2021-03-03T14:00:00Z 2021-03-03T14:00:00Z 2021-03-03T14:05:00Z 
2021-03-03T14:10:00Z 2021-03-03T14:10:00Z 2021-03-03T14:05:00Z 
QUERY_DATE           START_TIME           STOP_TIME            
-------------------- -------------------- -------------------- 
2021-03-03T14:00:00Z 2021-03-03T13:05:00Z 2021-03-03T14:00:00Z 
2021-03-03T14:10:00Z 2021-03-03T13:05:00Z 2021-03-03T14:00:00Z 
您需要的是13:05到14:00之间的数据,但您排除的唯一数据是尚未收到的数据(14:00之后),因此您可以在14:00之前获取所有数据,或者由于间隔的开始和停止时间不匹配,因此根本没有数据

尝试此操作,假设查询在一个小时的顶部或之后运行,并且您希望捕获从前一小时的前五分钟到当前一小时的顶部(即前一小时的最后55分钟)的所有内容:

现在,如果作业时间(sysdate)是14:00和14:59之间的任意时间,则谓词的开始时间始终是13:05,停止时间始终是14:00

select to_date('2021-03-03 14:00','YYYY-MM-DD HH24:MI') query_date,
(trunc(to_date('2021-03-03 14:00','YYYY-MM-DD HH24:MI'),'HH24') - interval '55' minute) start_time,
(trunc(to_date('2021-03-03 14:00','YYYY-MM-DD HH24:MI'),'HH24')) stop_time
from dual
union
select to_date('2021-03-03 14:10','YYYY-MM-DD HH24:MI') query_date,
(trunc(to_date('2021-03-03 14:10','YYYY-MM-DD HH24:MI'),'HH24') - interval '55' minute) start_time,
(trunc(to_date('2021-03-03 14:10','YYYY-MM-DD HH24:MI'),'HH24')) stop_time
from dual;
结果:

QUERY_DATE           START_TIME           STOP_TIME            
-------------------- -------------------- -------------------- 
2021-03-03T14:00:00Z 2021-03-03T14:00:00Z 2021-03-03T14:05:00Z 
2021-03-03T14:10:00Z 2021-03-03T14:10:00Z 2021-03-03T14:05:00Z 
QUERY_DATE           START_TIME           STOP_TIME            
-------------------- -------------------- -------------------- 
2021-03-03T14:00:00Z 2021-03-03T13:05:00Z 2021-03-03T14:00:00Z 
2021-03-03T14:10:00Z 2021-03-03T13:05:00Z 2021-03-03T14:00:00Z 
一般来说,最好保持积极的主张(即介于两者之间);负面条件(即不在两者之间)倾向于阻止CBO使用索引(如果存在)

或者,如果您曾经想要一个更大的时间范围,并且总是想要排除任何一个小时中恰好落在该范围内的前五分钟,您可以这样做:

where filed_date
      between (sysdate - interval '3' hour) and sysdate
  and to_number(to_char(filed_date,'MI'),'99') > 5

这会将存档日期的分钟数部分限制为6分钟或更多,有效地过滤掉该范围内任何一小时的前五分钟。

这是正确的代码吗?如果存档日期不在当前时间戳和(TRUNC(SYSDATE,'hh24')+interval'5'分钟)之间,则它是一个日期数据类型谢谢,但请解释“interval'55'分钟”部分,因为它与“5分钟”排除查询相关。我已经更新了我的答案来解释间隔,以及原始谓词实际上没有排除任何行的原因。如前所述,它总是要么不排除任何内容,要么排除所有内容,这取决于sysdate是否出现在一小时的前5分钟。谢谢。现在我看了一下,我的查询确实涵盖了一个时间段,即将来数据还不存在的时间段。要纠正这一点,查询应该在最后一个小时内提取最近55分钟的数据。你的解释和质疑是有道理的,谢谢