gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:17:00 25 4
gpt4 key购买 nike

我正在编写监视软件,其中大多数逻辑将存在于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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com