code

Oracle 날짜 "Between" 쿼리

starcafe 2023. 2. 16. 21:57
반응형

Oracle 날짜 "Between" 쿼리

Oracle 데이터베이스를 사용하고 있습니다.두 날짜 사이의 데이터를 확인하기 위해 하나의 쿼리를 실행하고 싶습니다.

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'

하지만 위의 질문에서 아무런 결과를 얻지 못했습니다.'좋아요'와 '%'를 써야 할 것 같아요.하지만 어디에 써야 할지 모르겠어.여기 조명 좀 켜주세요.

출력으로 판단하면 START_DATE를 타임스탬프로 정의한 것 같습니다.정기적인 날짜일 경우 Oracle은 암묵적인 변환을 처리할 수 있습니다.하지만 당신은 데이트하기 위해 그 조건들을 명시적으로 캐스팅할 필요는 없습니다.

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가 시간 요소를 가지고 있기 때문입니다.시간 구성 요소를 지정하지 않으면 오라클이 기본적으로 0시로 설정합니다.그건 저쪽에서 보면 괜찮아요.BETWEEN하지만 아직까지는 아니다:

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) 

이러한 문제들 때문에 많은 사람들은 의 사용을 피하는 것을 선호한다.between하다

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

문자열 대신 실제 날짜로 변환해야 합니다. 다음을 시도해 보십시오.

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');

APC가 올바르게 지적한 바와 같이 start_date 열은 TIMESTAMP WITH LOCAL TIMEZONE 또는 TIMESTAMP WITH TIMESTAMP WITH TIMEZONE 데이터 형식이 될 수도 있습니다.데이터베이스 서버가 사용자 자신과 다른 시간대에 있는 경우 데이터에 대한 쿼리에 영향을 줄 수 있습니다.다만, 심플하게 해, 서버와 같은 타임 존에 있는 것을 전제로 합니다.먼저 start_date가 TIMESTAMP 데이터 유형인지 확인합니다.

SQLPlus DESCRIBE 명령어(또는 IDE에서는 동등한 명령어)를 사용하여 이 열이 TIMESTAMP 데이터 유형인지 확인합니다.

표 설명

보고 대상:

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

Type = TIMESTAMP로 보고되는 경우 인수(또는 그림)가 필요 없는 가장 간단한 TO_TIMESTAMP 날짜 변환으로 날짜 범위를 쿼리할 수 있습니다.

TO_TIMESTamp를 사용하여 START_DATE 열의 인덱스가 옵티마이저에 의해 고려되도록 합니다.APC의 답변에서는 이 열에 함수 기반 인덱스가 생성되어 SQL 술어에 영향을 줄 수 있지만 이 쿼리에서 이에 대해 언급할 수 없습니다.테이블에 적용된 인덱스를 확인하는 방법을 알고 싶으시면 다른 질문을 올려주시면 별도로 답변해 드리겠습니다.

따라서 start_date에 인덱스가 존재하며, 이는 TIMESTAMP 데이터 유형이며 옵티마이저가 이를 고려하도록 할 경우 SQL은 다음과 같습니다.

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

+.99999999는 매우 가깝지만 완전히 1은 아니기 때문에 17-JAN-10의 변환은 가능한 그날 자정에 가깝기 때문에 쿼리에서는 두 행이 모두 반환됩니다.

데이터베이스에는 BETWEEN이 15-JAN-10 00:00:0000000 ~17-JAN-10 23:59:59:9999로 표시되므로 타임스탬프의 시간 구성요소에 관계없이 2010년 1월 15일, 16일 및 17일의 모든 날짜가 포함됩니다.

쿼리 사이의 날짜

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');

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

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'))

언급URL : https://stackoverflow.com/questions/2369222/oracle-date-between-query

반응형