복붙노트

[SQL] 검색어 "사이"오라클 날짜

SQL

검색어 "사이"오라클 날짜

나는 오라클 데이터베이스를 사용하고 있습니다. 나는 두 날짜 사이의 데이터를 확인하기 위해 하나 개의 쿼리를 실행합니다.

NAME               START_DATE    
-------------    ------------- 
Small Widget       15-JAN-10 04.25.32.000000 PM      
Product 1          17-JAN-10 04.31.32.000000 PM  



select * from <TABLENAME> where start_date  
BETWEEN '15-JAN-10' AND '17-JAN-10'

하지만 위의 쿼리에서 어떤 결과를 얻을니까. 내가하고 "%" "좋아요"를 사용해야합니다 생각합니다. 그러나 나는 그들을 사용하는 위치를 잘 모릅니다. 이에 대한 몇 가지 빛을 던져 주시기 바랍니다.

사전에 감사합니다.

해결법

  1. ==============================

    1.당신은 타임 스탬프로 START_DATE를 정의처럼 출력에서 ​​판단이 보인다. 그것은 정기적으로 날짜 인 경우 오라클은 암시 적 변환을 처리 할 수있을 것입니다. 그렇지 않은하지만 당신은 명시 적으로 날짜로 그 문자열을 캐스팅 할 필요가있다.

    당신은 타임 스탬프로 START_DATE를 정의처럼 출력에서 ​​판단이 보인다. 그것은 정기적으로 날짜 인 경우 오라클은 암시 적 변환을 처리 할 수있을 것입니다. 그렇지 않은하지만 당신은 명시 적으로 날짜로 그 문자열을 캐스팅 할 필요가있다.

    SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
      2  /
    
    Session altered.
    
    SQL>
    SQL> select * from t23
      2  where start_date between '15-JAN-10' and '17-JAN-10'
      3  /
    
    no rows selected
    
    SQL> select * from t23
      2  where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
      3  /
    
    WIDGET                          START_DATE
    ------------------------------  ----------------------
    Small Widget                    15-JAN-10 04.25.32.000    
    
    SQL> 
    

    그러나 우리는 여전히 하나 개의 행을 얻을. START_DATE는 시간 요소를 가지고 있기 때문이다. 우리는 자정 시간 구성 요소 오라클 기본값을 지정하지 않는 경우. 그건 괜찮지 사이가 아닌 대한의 측면에서 측면까지 :

    SQL> select * from t23
      2  where start_date between to_date('15-JAN-10') 
      3                       and to_date('17-JAN-10 23:59:59')
      4  /
    
    WIDGET                          START_DATE
    ------------------------------  ----------------------
    Small Widget                    15-JAN-10 04.25.32.000
    Product 1                       17-JAN-10 04.31.32.000
    
    SQL>
    

    편집하다

    당신은 시간 구성 요소에 전달할 수없는 경우 선택의 몇 가지있다. 하나는 기준에서 시간 요소를 제거하기 위해 WHERE 절을 변경하는 것입니다 :

    where trunc(start_date) between to_date('15-JAN-10') 
                                and to_date('17-JAN-10')
    

    이 START_DATE의 모든 B-tree 인덱스 자격을 상실하기 때문에 성능에 영향을 미칠 수 있습니다. 대신 함수 기반 인덱스를 작성해야합니다.

    또는 당신은 당신의 코드에서 날짜에 시간 요소를 추가 할 수 있습니다 :

    where start_date between to_date('15-JAN-10') 
                         and to_date('17-JAN-10') + (86399/86400) 
    

    때문에 이러한 문제의 많은 사람들이이 같은 날짜의 경계를 확인하여 사이의 사용을 방지하기 위해 선호 :

    where start_date >= to_date('15-JAN-10') 
    and start_date < to_date('18-JAN-10')
    
  2. ==============================

    2.이 시도 대신 문자열의 실제 날짜에 사람들을 변환해야합니다 :

    이 시도 대신 문자열의 실제 날짜에 사람들을 변환해야합니다 :

    SELECT *
    FROM <TABLENAME>
    WHERE start_date BETWEEN TO_DATE('2010-01-15','YYYY-MM-DD') AND TO_DATE('2010-01-17', 'YYYY-MM-DD');
    

    지정된 형식의 거래에 편집 :

    SELECT *
    FROM <TABLENAME>
    WHERE start_date BETWEEN TO_DATE('15-JAN-10','DD-MON-YY') AND TO_DATE('17-JAN-10','DD-MON-YY');
    
  3. ==============================

    3.APC가 바르게 지적한 바와 같이, 당신의 시작일 열은 타임 스탬프로 표시하지만 너무 TIMESTAMP WITH LOCAL TIMEZONE 또는 TIMESTAMP WITH TIMEZONE 데이터 타입이 될 수 있습니다. 다음은 당신의 데이터베이스 서버가 자신에게 다른 시간대에 있다면 당신은 데이터에 수행 된 모든 쿼리에 영향을 미칠 수 있습니다. 그러나 이제이 간단한을 유지하고 당신이 당신의 서버와 같은 시간대에 가정하자. 첫째, 당신에게 자신감을주는 시작일이 TIMESTAMP 데이터 유형임을 확인합니다.

    APC가 바르게 지적한 바와 같이, 당신의 시작일 열은 타임 스탬프로 표시하지만 너무 TIMESTAMP WITH LOCAL TIMEZONE 또는 TIMESTAMP WITH TIMEZONE 데이터 타입이 될 수 있습니다. 다음은 당신의 데이터베이스 서버가 자신에게 다른 시간대에 있다면 당신은 데이터에 수행 된 모든 쿼리에 영향을 미칠 수 있습니다. 그러나 이제이 간단한을 유지하고 당신이 당신의 서버와 같은 시간대에 가정하자. 첫째, 당신에게 자신감을주는 시작일이 TIMESTAMP 데이터 유형임을 확인합니다.

    SQLPLUS이 칼럼을 확인하는 명령 (또는 IDE에 해당하는) DESCRIBE 사용하는 것은 TIMESTAMP 데이터 유형입니다.

    예를 들어,

    MYTABLE DESCRIBE

    보고해야합니다 :

    Name        Null? Type
    ----------- ----- ------------
    NAME              VARHAR2(20) 
    START_DATE        TIMESTAMP
    

    그것이 유형으로보고되는 경우 = 타임 스탬프 당신은 간단한 TO_TIMESTAMP 날짜 변환에는 인수가 필요하지 않습니다 하나 (또는 ​​그림)로 날짜 범위를 조회 할 수 있습니다.

    우리는 START_DATE 컬럼에 어떤 인덱스가 옵티 마이저에 의해 고려 될 수 있도록 TO_TIMESTAMP를 사용합니다. APC의 대답은 함수 기반 인덱스가이 칼럼에 생성 된 수 있고 즉, SQL 술어에 영향을 미칠 것입니다하지만 우리는이 쿼리에 있음에 언급 할 수 있다고 지적했다. 당신이 인덱스가 테이블에 적용되어 무엇을 찾는 방법을 알고 싶다면, 다른 질문을 게시 우리는 따로 답변을 할 수 있습니다.

    그래서,이 가정하는 것은 TIMESTAMP 데이터 타입이다 START_DATE에 대한 인덱스는, 그리고 당신은 당신의 SQL이 될 것 옵티마이을 고려하는 것이 좋습니다 :

    select * from mytable where start_date between to_timestamp('15-JAN-10') AND to_timestamp('17-JAN-10')+.9999999
    

    +.999999999 매우 가까운하지만 17-JAN-10의 변환이 가능한 당일 자정에 가까운 그러므로 당신에게 쿼리 반환 두 행을 할 수 있도록 확실히 일이 아니다.

    데이터베이스는 사이에 표시됩니다으로 00 15-JAN-10 : 00 : 00 : 59 : 59 : 0,000,000 17-JAN-10 23-99999 및 15, 16 및 2010년 1월 17일 어떤 시간에서 날짜를 모두 포함되므로 것 타임 스탬프의 구성 요소입니다.

    희망이 도움이.

    Dazzer

  4. ==============================

    4.검색어 사이에 날짜

    검색어 사이에 날짜

    SELECT *
        FROM emp
        WHERE HIREDATE between to_date (to_char(sysdate, 'yyyy') ||'/09/01', 'yyyy/mm/dd')
        AND to_date (to_char(sysdate, 'yyyy') + 1|| '/08/31', 'yyyy/mm/dd');
    
  5. ==============================

    5.다음 쿼리도 사용할 수 있습니다 :

    다음 쿼리도 사용할 수 있습니다 :

    select * 
      from t23
     where trunc(start_date) between trunc(to_date('01/15/2010','mm/dd/yyyy')) and trunc(to_date('01/17/2010','mm/dd/yyyy'))
    
  6. from https://stackoverflow.com/questions/2369222/oracle-date-between-query by cc-by-sa and MIT license