Oracle SQL遍历日期
我有一个包含用户系统登录信息的表 我想报告任何“非工作时间”活动-时间确定为20:00至次日06:00之间 我可以运行一个简单的查询,返回我需要的信息: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
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问题,一张图片抵得上千言万语。您可以将时间部分和日期部分作为单独的条件进行比较。