Oracle SQL遍历日期

Oracle SQL遍历日期,sql,oracle,Sql,Oracle,我有一个包含用户系统登录信息的表 我想报告任何“非工作时间”活动-时间确定为20:00至次日06:00之间 我可以运行一个简单的查询,返回我需要的信息: select to_char(logon_time, 'YYYY-MM-DD HH24:MI') , username from sessions where to_char(logon_time, 'YYYY-MON-DD HH24:MI') between '&YEAR-&MONTH-01 20:00' and '&a

我有一个包含用户系统登录信息的表

我想报告任何“非工作时间”活动-时间确定为20:00至次日06:00之间

我可以运行一个简单的查询,返回我需要的信息:

select to_char(logon_time, 'YYYY-MM-DD HH24:MI') , 
username from sessions 
where to_char(logon_time, 'YYYY-MON-DD HH24:MI') 
between '&YEAR-&MONTH-01 20:00' and '&YEAR-&MONTH-02 06:00';
注意,我必须在这个查询中手动定义单个的“天”——在这种情况下,它是从01日的20:00到02日的06:00

我想做的是为一个大的日期范围运行一个报告(例如,从年初一直到SYSDATE),自动迭代各个日期,同时考虑到子查询已经有一个跨越多个日期的特定日期范围子句


我不知道怎样才能做到这一点。非常感谢任何线索

您可以使用以下方法识别所有非工作时间登录:

SELECT logon_time,
       username
FROM   sessions
WHERE  EXTRACT( HOUR FROM CAST( logon_time AS TIMESTAMP ) ) < 6
OR     EXTRACT( HOUR FROM CAST( logon_time AS TIMESTAMP ) ) >= 20
选择登录时间,
用户名
来自会话
其中EXTRACT(从CAST开始的小时数(登录时间作为时间戳))<6
或提取(从强制转换开始的小时数(登录时间作为时间戳))>=20
如果您想将其用于特定的日期范围,则:

SELECT logon_time,
       username
FROM   sessions
WHERE  (   EXTRACT( HOUR FROM CAST( logon_time AS TIMESTAMP ) ) < 6
       OR  EXTRACT( HOUR FROM CAST( logon_time AS TIMESTAMP ) ) >= 20 )
AND    logon_time BETWEEN DATE '2016-05-01' AND SYSDATE
选择登录时间,
用户名
来自会话
其中(提取(从强制转换开始的小时数(登录时间作为时间戳))<6
或提取(从强制转换开始的小时数(登录时间作为时间戳))>=20)
以及日期“2016-05-01”和系统日期之间的登录时间

将获得从5月1日午夜到当前时间的非工作时间登录。

如果您能向我们展示一些示例数据,那就太好了。对于SQL问题,一张图片抵得上千言万语。您可以将时间部分和日期部分作为单独的条件进行比较。