Programing

Where 절의 Oracle DateTime?

lottogame 2020. 10. 21. 07:37
반응형

Where 절의 Oracle DateTime?


다음과 같은 SQL이 있습니다.

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')

-> 이것은 10 개의 행을 반환하고 TIME_CREATED = '26 -JAN-2011 '

이제 내가 이것을 할 때 나는 어떤 행도 다시 얻지 못합니다.

SELECT EMP_NAME, DEPT
    FROM EMPLOYEE
    WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')

-> 아웃보다 더 큰 걸

이유는 무엇입니까?


예 : TIME_CREATED에는 날짜와 시간이 포함 됩니다. TRUNC시간 제거에 사용 :

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

업데이트 :
Dave Costa가 아래 주석에서 지적했듯이, 이것은 Oracle이 TIME_CREATED존재하는 경우 열의 인덱스를 사용하는 것을 방지 합니다. 이 문제가없는 대안은 다음과 같습니다.

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') 
      AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1

다음을 사용하여 쿼리에 TIME 부분을 포함 할 수도 있습니다.

SELECT EMP_NAME
     , DEPT
  FROM EMPLOYEE 
 WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');

이는 DATEOracle 열에 시간 부분도 포함 되기 때문 입니다. to_date()함수 의 결과는 시간이로 설정된 날짜 00:00:00이므로 테이블의 어떤 행과도 일치하지 않을 수 있습니다.

다음을 사용해야합니다.

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

다른 사람들이 위에서 언급했듯이 TRUNC를 사용하면 인덱스 사용이 방지됩니다 (TIME_CREATED에 인덱스가있는 경우). 이러한 문제를 방지하기 위해 쿼리를 다음과 같이 구성 할 수 있습니다.

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') 
            AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second;

86399는 하루의 초 수보다 1 초 적습니다.


다음을 수행 할 수도 있습니다.

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'

참고 URL : https://stackoverflow.com/questions/6749369/oracle-datetime-in-where-clause

반응형