如何在 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 BY
和 COUNT
,如下所示:
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 中创建一个以时间段递增的循环的主要内容,如果未能解决你的问题,请参考以下文章