【问题标题】:Query to Oracle DB for a data within a time range for a year向Oracle DB查询一年时间范围内的数据
【发布时间】:2018-02-12 15:29:52
【问题描述】:

我正在使用 Oracle DB 版本 - Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production。

我正在尝试从某个时间范围内的审核表中获取数据 - 例如:

Select * from AUDIT_TABLE where time > '13/02/2018 19:00:00' and time < '14/02/2018 07:00:00'

这里,时间列数据类型是DATE

但是,企业需要过去 1 年的数据。因此,我们需要运行最近 1 年的此类数据。

我们有两个想法: 1)我们可以编写一个proc并传递开始日期和结束并在db中查询365次,并且可以将结果写入文件/temp db中

2) 查询全年数据并在excel中放入过滤器。

但是,这两种想法似乎都需要花费很多精力并且不是很好的解决方案。有什么方法可以快速做到这一点。

说,我们的数据集是这样的:

ID  TIMESTAMP       USER_ID
1   09/07/2012 09:52:05 XXXXXXX
2   09/07/2012 09:57:06 YYYYY
3   09/10/2012 10:49:10 ZZZZZZ
4   09/25/2012 05:58:37 ABCCC
5   09/25/2012 06:00:30 XXXXXXX
6   09/25/2012 06:07:03 YYYYY
7   09/25/2012 13:38:18 ZZZZZZ
8   09/26/2012 12:12:59 ABCCC
9   09/27/2012 11:01:29 XXXXXXX
10  09/28/2012 05:59:47 YYYYY
11  09/28/2012 06:06:58 ZZZZZZ
12  09/28/2012 06:07:28 ABCCC
13  10/03/2012 14:04:48 XXXXXXX
14  10/06/2012 12:44:08 YYYYY
15  10/09/2012 05:59:47 ZZZZZZ
16  10/09/2012 06:03:35 ABCCC
17  10/09/2012 06:04:04 XXXXXXX
18  10/09/2012 06:15:28 YYYYY
19  10/10/2012 06:54:21 ZZZZZZ
20  10/11/2012 07:54:18 ABCCC
21  10/11/2012 08:16:41 XXXXXXX
22  10/11/2012 08:23:08 YYYYY
23  10/11/2012 09:44:42 ZZZZZZ
24  10/11/2012 11:46:30 ABCCC
25  10/12/2012 06:32:33 XXXXXXX    

我们只想要 19:00 到 07:00 的结果集,这将是单个结果集中一年的数据并返回类似:

ID  TIMESTAMP       USER_ID
4   09/25/2012 05:58:37 ABCCC
5   09/25/2012 06:00:30 XXXXXXX
6   09/25/2012 06:07:03 YYYYY
10  09/28/2012 05:59:47 YYYYY
11  09/28/2012 06:06:58 ZZZZZZ
12  09/28/2012 06:07:28 ABCCC
15  10/09/2012 05:59:47 ZZZZZZ
16  10/09/2012 06:03:35 ABCCC
17  10/09/2012 06:04:04 XXXXXXX
18  10/09/2012 06:15:28 YYYYY
19  10/10/2012 06:54:21 ZZZZZZ
25  10/12/2012 06:32:33 XXXXXXX

提前致谢。

【问题讨论】:

  • 您希望去年的每一天都使用相同的时间范围,直到当前日期 - 全部在一个结果集中?但只有那 12 小时的窗口吗? (那么恰好 19:00 或 07:00 的记录呢 - 其中一个应该是 >= 或
  • 是的,应该是>=和
  • 请显示示例数据和预期输出。

标签: oracle date select oracle11g range


【解决方案1】:

您可以通过与12(月) 进行比较来轻松使用months_between 来获取最近一年到当前日期的值:

SELECT * 
  FROM AUDIT_TABLE 
 WHERE months_between(sysdate,time)<=12
 ORDER BY time;

【讨论】:

    【解决方案2】:

    假设你的意思是time &gt;= 19:00:00 and time &lt; 07:00:00(忽略日期)你可以这样:

    select * from AUDIT_TABLE
    where time >= add_months(trunc(sysdate), -12) + 19/24
    and extract(hour from cast(time - 7/24 as timestamp)) >= 12
    

    第一个过滤器在今天早上的午夜,回溯 12 个月,然后增加 19 小时以到达您感兴趣的窗口的开头。

    第二个过滤器将时间调整为 7 小时,只是使比较更容易,因此有效范围现在不跨越午夜,并从中提取小时数。

    快速演示:

    with audit_table (id, time) as (
                select 1, to_date('2017-02-12 18:59:59', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 2, to_date('2017-02-12 19:00:00', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 3, to_date('2017-02-12 19:00:01', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 4, to_date('2017-02-13 06:59:59', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 5, to_date('2017-02-13 07:00:00', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 6, to_date('2017-02-13 07:00:01', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 7, to_date('2018-02-11 18:59:59', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 8, to_date('2018-02-11 19:00:00', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 9, to_date('2018-02-11 19:00:01', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 10, to_date('2018-02-11 23:59:59', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 11, to_date('2018-02-12 00:00:00', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 12, to_date('2018-02-12 00:00:01', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 13, to_date('2018-02-12 06:59:59', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 14, to_date('2018-02-12 07:00:00', 'YYYY-MM-DD HH24:MI:SS') from dual
      union all select 15, to_date('2018-02-12 07:00:01', 'YYYY-MM-DD HH24:MI:SS') from dual
    )
    select * from AUDIT_TABLE
    where time >= add_months(trunc(sysdate), -12) + 19/24
    and extract(hour from cast(time - 7/24 as timestamp)) >= 12
    /
    
            ID TIME               
    ---------- -------------------
             2 2017-02-12 19:00:00
             3 2017-02-12 19:00:01
             4 2017-02-13 06:59:59
             8 2018-02-11 19:00:00
             9 2018-02-11 19:00:01
            10 2018-02-11 23:59:59
            11 2018-02-12 00:00:00
            12 2018-02-12 00:00:01
            13 2018-02-12 06:59:59
    

    如果你真的想要time &gt; 19:00:00 and time &lt;= 07:00:00,你可以再调整一秒:

    select * from AUDIT_TABLE
    where time > add_months(trunc(sysdate), -12) + 19/24
    and extract(hour from cast(time - 7/24 - 1/86400 as timestamp)) >= 12
    
            ID TIME               
    ---------- -------------------
             3 2017-02-12 19:00:01
             4 2017-02-13 06:59:59
             8 2018-02-11 19:00:00
             9 2018-02-11 19:00:01
            10 2018-02-11 23:59:59
            11 2018-02-12 00:00:00
            12 2018-02-12 00:00:01
            13 2018-02-12 06:59:59
            14 2018-02-12 07:00:00
    

    如果你真的是说time &gt;= 19:00:00 and time &lt;= 07:00:00,那么你可以将第一个版本与对最后一秒的更明确的检查结合起来:

    select * from AUDIT_TABLE
    where time >= add_months(trunc(sysdate), -12) + 19/24
    and (
      extract(hour from cast(time - 7/24 as timestamp)) >= 12
      or time - 7/24 = trunc(time)
    )
    
            ID TIME               
    ---------- -------------------
             2 2017-02-12 19:00:00
             3 2017-02-12 19:00:01
             4 2017-02-13 06:59:59
             5 2017-02-13 07:00:00
             8 2018-02-11 19:00:00
             9 2018-02-11 19:00:01
            10 2018-02-11 23:59:59
            11 2018-02-12 00:00:00
            12 2018-02-12 00:00:01
            13 2018-02-12 06:59:59
            14 2018-02-12 07:00:00
    

    【讨论】:

    • 它正在工作。非常感谢,我试图支持您的想法,但我的声誉太低而无法支持。但是,再次感谢。
    【解决方案3】:

    试试这个:

    SELECT * 
    FROM AUDIT_TABLE 
    WHERE `time` BETWEEN SYSDATE - '12' MONTH AND SYSDATE
    ORDER BY `time`;
    

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2012-06-20
      • 2023-01-19
      • 2014-05-07
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多