>

Oracle DB 버전-Oracle Database 11g Enterprise Edition 릴리스 11.2.0.3.0-64 비트 프로덕션을 사용하고 있습니다.

시간 범위에서 감사 테이블에서 데이터를 가져 오려고합니다.

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까지의 결과 집합 만 원하며 이는 단일 결과 집합의 1 년 동안의 데이터에 대한 것이며 다음과 같은 결과를 반환합니다.

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

미리 감사합니다.


  • 답변 # 1

    당신은 쉽게 months_between 를 사용할 수 있습니다   12 와 비교하여 현재 날짜까지 지난 1 년의 값을 가져 오려면 (개월) :

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

  • 답변 # 2

    정말로 time >= 19:00:00 and time < 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 > 19:00:00 and time <= 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 >= 19:00:00 and time <= 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`;
    
    

  • 이전 C ++ 그렇지 않으면 두 명령문이 실행되지 않아야하는 경우
  • 다음 regex - ng 빌드는 regExp로 인해 오류를 발생시킵니다