Oracle SQL迭代日期

时间:2016-06-02 11:58:15

标签: 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 '&YEAR-&MONTH-02 06:00';

请注意,我必须手动定义个别日期'在此查询中 - 在这种情况下,它是从01月20日20:00到当月02日06:00。

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

我无法理解如何实现这一目标。任何线索都非常感谢!

1 个答案:

答案 0 :(得分:2)

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

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

如果您想要特定日期范围,那么:

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

将从5月1日午夜到当前时间进行非工作时间登录。