【问题标题】:Oracle SQL iterate through datesOracle SQL 遍历日期
【发布时间】:2016-06-02 20:08:34
【问题描述】:

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

我想报告任何“非工作时间”活动 - 时间被确定为第二天 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),自动迭代各个日期,同时考虑到子查询已经有跨越多天的日期范围子句之间的特定。

我不知道如何实现这一目标。任何线索都非常感谢!

【问题讨论】:

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

标签: sql oracle


【解决方案1】:

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

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 日午夜到当前时间的非工作时间登录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多