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

Dynamically excluding first 5 minutes of data each hour of loading

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

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

我已经试过了,但是它排除了 0 条记录,所以它没有检测到“Filed_Date”

的每分钟差异
where FILED_DATE not between SYSDATE 
and ( TRUNC( SYSDATE, 'hh24' ) + interval '5' minute )

排除我需要排除的数据的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 

你想要的是从13:05到14:00的数据,但是你唯一排除的数据是你还没有收到的数据(在14:00之后),所以你获得 所有 直到 14:00,或者由于间隔的开始和停止时间不匹配而根本没有数据。

试试这个,假设查询 运行s 在整点或整点之后,并且您想捕获前一小时的前五分钟之后到当前整点的所有内容(即前一小时的最后 55 分钟):

where filed_date  
      between (trunc(sysdate,'HH24') - interval '55' minute) -- start time
      and (trunc(sysdate,'HH24'))                            -- end time

现在,如果作业时间 (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-03T13:05:00Z 2021-03-03T14:00:00Z 
2021-03-03T14:10:00Z 2021-03-03T13:05:00Z 2021-03-03T14:00:00Z 

一般来说,最好坚持肯定的断言(即 BETWEEN);负面条件(即 NOT BETWEEN)往往会阻止 CBO 使用索引(如果存在)。

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

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

这会将 filed_date 的分钟部分限制为 6 或更多,有效地过滤掉范围内 任何 小时的前五分钟。