【问题标题】:How to search 30 minute interval in plsql?如何在plsql中搜索30分钟间隔?
【发布时间】:2018-06-22 08:38:04
【问题描述】:

我想编写一个查看特定表的 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 分钟运行一次这项工作。

【问题讨论】:

  • 没有sysdate - 1/24 帮助吗?
  • 您希望如何处理这些行?您不能只在 PL/SQL 块中运行 select 语句;您必须将结果返回到某些东西中(例如,将它们插入表中,将它们收集到数组中等)。

标签: sql database oracle plsql


【解决方案1】:

为了获得更好的性能,请使用以下代码计算 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';

如果你有固定状态而不是使用 = 而不是 like'%status%' 运算符。

【讨论】:

    【解决方案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 子句,这样代码就会失败。另外,您打算如何处理查询返回的值?也许最简单的选择是将它们插入到某个表中,然后对它们进行某事

    【讨论】:

    • 恐怕我不明白你在说什么,@SantoshPawar。 PERSISTED_DATE 是什么?为什么要早于现在的 45 分钟?
    • 当您将间隔指定为 trunc(sysdate) + 30 / (24 * 60) 时,作业将在每天 00:30:00 运行一次。由于“下一个日期”是在当前工作完成后计算的,因此您应该使用 TRUNC(SYSDATE, 'HH') + 30 / (24 * 60)
    • 谢谢你,@Wernfried。固定。
    【解决方案3】:

    问题令人困惑,因为您说您希望创建时间> 1hr 及以上

    如果您有大量数据,我会使用单个语句并确保表被正确索引

    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 或编写操作系统批处理来定期调用您的脚本

    【讨论】:

    • 希望creation_date 列的数据类型是不是 varchar2
    猜你喜欢
    • 2020-03-03
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2019-04-12
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多