oracle - 在Oracle数据库中存储重复时间段

标签 oracle time plsql monitoring cronexpression

我正在编写监视软件,其中大多数逻辑将存在于Oracle databasen&pl/sql中。

调用我的监视程序时,它应该警告问题。例如,如果,则应该警告有关问题
1.星期五22:00至23:00每分钟少于2次操作
2. 1月31日22:00-23:00,每分钟少于5次操作
3.从10:00到12:00,每天每分钟少于3次操作
如果在1月31日22:30进行监视,则应该将操作号与5进行比较。
4.从星期五22:00到星期一15:00每分钟少于5次操作

我正在考虑将cron表达式格式的数据周期保存在数据库中。在这种情况下,我必须将SYSDATE(监视功能的当前调用日期)与保存在数据库中的cron表达式进行比较。

我的问题:
1.如何确定SYSDATE是否属于cron表达式?
2.在这种情况下完全使用cron表达式是否正确?您能建议其他节省时间的方法吗?

最佳答案

不要做

我完全同意SpaceTrucker:不要在SQL或PL/SQL中执行,请在Java中使用Java 8 date APIJodaTime进行。

尽管如此,该怎么做

但是,即使您不应该这样做,也仍然有一些充分的理由要这样做。因此,方法如下:

您要检查的每个瞬间的表格

首先,让我们为要检查的间隔中的每一秒或每一分钟创建一个表。间隔的间隔和长度取决于您要允许的cron表达式。通常一整周的一秒钟就足够了(大约100'000行)。如果要检查全年,请使用分钟作为粒度(约50万行)。对于现代数据库而言,数量或行都不是什么。在我的笔记本上,相应的查询会立即返回。

CREATE TABLE week AS
SELECT 
  running_second,
  ts, 
  EXTRACT(SECOND FROM ts) as sec,
  EXTRACT(MINUTE FROM ts) as min,
  EXTRACT(HOUR FROM ts) as h,
  to_char(ts, 'Day') as dow
FROM (  
  SELECT 
    level as running_second,
    TO_TIMESTAMP_TZ('2015-09-05 00:00:00 0:00',
     'YYYY-MM-DD HH24:MI:SS TZH:TZM') + 
     NUMTODSINTERVAL(level-1, 'SECOND') AS ts
  FROM dual CONNECT BY level<=60*60*24*7
)
;

查询每个过滤器表达式

接下来,将每个cron表达式转换为查询。您可以使用PL/SQL将每个cron表达式转换为where子句,也可以使用通用的where子句。

您应该得到这样的内容:
SELECT
  *
FROM
  week
WHERE
  h  =5
AND min=0
AND sec=0;

或通用版本:
SELECT
  filter_expression.name, week.ts
FROM
  week, filter_expressions
WHERE
  (fiter_hour is null or h  = filter_hour) 
AND (filter_min is null or min = filer_min)
AND (filter_sec is null or sec = filter_sec);

(假设您的过滤器存储在表filter_expressions中,该表的每种约束类型都有一列,并且每行都有约束的参数或NULL(如果约束不适用))。

将结果存储在全局临时表cron_startpoints中。

检查违规

对表cron_startpoints进行分组以检查约束是否违反。您可以计算周五或午夜有多少场比赛,并且可以检查该数字是否适合您。

关于oracle - 在Oracle数据库中存储重复时间段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699044/

相关文章:

sql - 在SQL中将列转换为行

oracle - 实现 VPD 谓词函数 - ORA-28110 : policy function or package has error

sql - 甲骨文移动平均线

.net - 如何将 sid 和 port 包含到 oracle 连接字符串中?

java - 使用 spring hibernate 从序列中获取下一个值

C++ 时间函数在不同调用时返回相同的值

windows - Oracle SQL Developer 客户端编码

oracle - 包装PLSQL过程时出错请帮助我

excel - 转换[h] :mm:ss to mm:ss in Excel

powershell - Windows Powershell v4.0 确认当前小时为 08,但 $hour > 1 计算结果为 "False"