itsource

Oracle Date Time in Where 절?

mycopycode 2023. 2. 26. 09:43
반응형

Oracle Date Time in Where 절?

다음과 같은 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')

-> out보다 큼직한 것을 뺐다.

어떤 이유에서요?

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

다음 작업도 가능합니다.

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

왜냐하면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초 적은 값입니다.

언급URL : https://stackoverflow.com/questions/6749369/oracle-datetime-in-where-clause

반응형