如何在 PL/SQL 中创建一个以时间段递增的循环

Posted

技术标签:

【中文标题】如何在 PL/SQL 中创建一个以时间段递增的循环【英文标题】:How to make a loop with increment of time period in PL/SQL 【发布时间】:2020-02-18 07:34:29 【问题描述】:

在我的 Oracle 数据库中有一个包含用户登录日期和时间的会话表。通过这个查询,我可以获得在给定时间段内登录(打开他们的会话)的用户数量 - 例如在一月份登录:

SELECT 
    COUNT(DISTINCT ses_username)
FROM
    sessions
WHERE
    to_char(ses_start_date, 'YYYY-MM-DD HH24:MI:SS') BETWEEN '2019-01-01 00:00:00' AND '2019-01-31 23:59:59'

如何在 PL/SQL 中创建一个循环,以每月或每月的天数或每月的小时数或每天的小时数,甚至每天的一刻钟(15 分钟)来计算。

编辑:

会话表格式为

ses_id  ses_start_date          ses_username
============================================
786895  2019-01-01 15:39:10     USER_1
786896  2019-01-01 15:39:11     USER_1
786897  2019-01-01 16:38:39     USER_1
786898  2019-01-01 16:38:40     USER_1
786899  2019-01-02 06:44:20     USER_2
786900  2019-01-02 06:44:21     USER_2
786901  2019-01-02 06:50:10     USER_3
786902  2019-01-02 06:50:11     USER_3
786903  2019-01-02 06:50:28     USER_4
786904  2019-01-02 06:50:30     USER_4
...

而且我需要知道在每月的每一天、每小时或每天每 15 分钟内登录了多少唯一用户名。

【问题讨论】:

请提供想要的结果和一些样本数据 我已编辑问题以获取更多信息。 【参考方案1】:

我不确定,循环提问是什么意思。但是,是的,如果您想按天查看数据,则可以使用 GROUP BYCOUNT,如下所示:

SELECT 
    TRUNC(ses_start_date) AS SESSION_DAY,
    COUNT(DISTINCT ses_username)
FROM
    sessions
WHERE
   TRUNC(ses_start_date) BETWEEN DATE '2019-01-01' AND DATE '2019-01-31'
   GROUP BY TRUNC(ses_start_date)

注意:不要将日期转换为字符并进行比较。如示例所示,可以直接比较日期。

干杯!!

【讨论】:

看起来很有趣。使用参数“格式”,TRUNC 函数会将其截断为小时或分钟。如果我认为正确... :-) TRUNC 将其截断为一天。 TRUNC() 可用于截断其他时间分量,例如分钟:select trunc( sysdate, 'MI' ) from dual 如果当天没有会话(没有用户登录),则日期(行)被限制在输出中。如何显示计数为 0 的日期? Nvl(count(), 0) 在这里不起作用。 要显示不在表格中的日期,您需要生成日期列表,然后左加入会话到该列表。如果您需要发布另一个问题。

以上是关于如何在 PL/SQL 中创建一个以时间段递增的循环的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL 中创建动态对象

如何在 PL/SQL 中创建两个表的记录类型?

如何在 PL/SQL 中按表集合使用索引

在 Oracle PL/SQL 中创建触发器时如何解决“编译错误成功”错误?

带有 PL SQL 的序列

在 with 子句中创建包含 pl/sql 定义的 mview