如何在plsql中搜索30分钟间隔?

时间:2018-06-22 08:38:04

标签: sql database oracle plsql

我想编写一个查找特定表的PL / SQL作业,并将适合某些条件的某些特定条目插入另一个表。

在特定列中,我的意思是在状态列中可能存在“进行中”。我想搜索这些在sysdate之间最多1小时的时间间隔包含“正在进行”条目的列。

我有这个代码,

begin
    SYS.DBMS_JOB.CHANGE
      ( job        => 121313
       ,what       =>  q'#
                          DECLARE
                            v_say         NUMBER;
                          BEGIN
                            select rowid, a.* 
                            from project_situation a 
                            WHERE a.STATUS like '%ONGOING%' 
                              and (a.CREATION_DATE) >= '?????' 
                            order by a.creation_date desc;

                            COMMIT;  
                          END;                   
                       #'
       ,next_date  =>  TRUNC(SYSDATE + 1) + 7/24
       ,interval   => 'TRUNC(SYSDATE + 1) + 7/24'
    );
    commit;    
end;
/

表中可能有很多条目。我想获取创建时间大于1小时的条目。创建时间格式为'22 / 09/2018 11:52:20'

我也想每30分钟执行一次这项工作。

3 个答案:

答案 0 :(得分:3)

为获得更好的性能,请使用以下代码计算1小时

PERSISTED_DATE<SYSDATE-60/1440. 

PERSISTED_DATE是您的日期列 60是分钟数。 60/1440是1小时的时间。

对于您的示例,假设您已给出表和列,则以下代码应获取所需的结果

select rowid, a.* from project_situation a 
         WHERE a.STATUS like '%ONGOING%' 
                and a.CREATION_DATE< SYSDATE-60/1440';

如果您的状态是固定的,则可以使用=而不是类似'%status%'的运算符。

答案 1 :(得分:2)

这是您在一小时前获得的方式-减去1小时(1/24,因为一天中有24小时):

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select sysdate right_now,
  2         sysdate - 1/24  one_hour_ago
  3  from dual;

RIGHT_NOW           ONE_HOUR_AGO
------------------- -------------------
22.06.2018 11:24:09 22.06.2018 10:24:09

SQL>

这意味着您正在寻找的条件是

WHERE a.STATUS like '%ONGOING%' 
  AND a.creation_date >= sysdate - 1/24

每30分钟运行一次作业需要以下内容:

trunc(sysdate, 'hh') + 30 / (24 * 60)
  • 30是“分钟”
  • 24 * 60是“一天24小时,一小时60分钟”

请注意以下几点:建议您将写入what的代码移到存储过程中。维护起来更容易。另外,由于它是PL/SQL,它的select需要一个您没有的into子句,因此代码将失败。另外,您打算如何处理查询返回的值?也许最简单的选择是将它们插入到某个表中,然后对它们执行 something

答案 2 :(得分:0)

问题令人困惑,因为您希望创建时间大于1小时且大于1小时

如果您有大量数据,我将使用一条语句并确保表已正确索引

INSERT INTO target_table (
 SELECT a.*
 FROM project_situation
 WHERE a.status like '%ONGOING%'
 AND a.creation_date < (sysdate - 1/24)
)

如果您需要将字符串与日期进行比较,而列不是日期,则需要添加to_date(creation_date,'DD/MM/YYYY HH24:MI:SS')

您使用dbms_job是正确的,但是您也可以使用dbms_scheduler或编写OS批处理来定期调用脚本