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
'code' 카테고리의 다른 글
Angular가 있는 컨트롤러에 서비스 주입JS (0) | 2023.02.22 |
---|---|
Dockerfile 다운로드 및 압축 해제 방법 (0) | 2023.02.18 |
컨트롤러에서 JSON 렌더링 (0) | 2023.02.16 |
'오류: [$parse:lexerr] 렉서 오류:heroku 전개 시 예기치 않은 다음 캐릭터' (0) | 2023.02.16 |
각도 방향에서 부울 값을 바인딩하려면 어떻게 해야 합니까? (0) | 2023.02.16 |