반응형
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');
이는 DATE
Oracle 의 열에 시간 부분도 포함 되기 때문 입니다. 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
반응형
'Programing' 카테고리의 다른 글
Ruby에서 밀리 초 단위로 작업 시간을 측정하는 방법은 무엇입니까? (0) | 2020.10.21 |
---|---|
sl4fj와 유사한 일반적인 문자열 대체 기능이 있습니까? (0) | 2020.10.21 |
Maven 패키지는 작동하지만 Intellij의 빌드가 실패합니다. (0) | 2020.10.21 |
자바 스크립트의 동적 함수 이름? (0) | 2020.10.21 |
HTTP를 통한 서비스 워커 테스트 옵션 (0) | 2020.10.21 |