2012-06-30 6 views
0

제가SYSDATE를 사용하여 날짜를 가져 오는 중 문제가 있습니까?

ID  EMP_DATE 
---- ----------- 
5400  14-FEB-2012 

아래와 같은 EMP_DATE 컬럼을 갖는 테이블 구조를 가지고 난들의 레코드를 가져 오는 동안 오전 레코드를 삽입 한 후

INSERT INTO TEST_DATE VALUES(5400,SYSDATE); 

아래와 같은 테이블에 레코드를 삽입 누가 EMP_DATESYSDATE으로 지정하면 해당 행을 선택하지 않습니다. 시간에 대한 SYSDATE는 '01 -JUL-2012`

SELECT * FROM TEST_DATE WHERE EMP_DATE = SYSDATE; 
       (OR) 
SELECT * FROM TESt_DATE WHERE EMP_DATE = '01-JUL-2012'; 

하자있는 나는 그림 밖으로 모든 솔루션을 수 없습니다. 제안 사항이 도움이 될 것입니다.

답변

5

주요 문제는 날짜에 허용되지 않는 시간, 분 및 초가 포함되어 있다는 것입니다. 당신은 하루에 모든 것을 원하는 경우에 당신은이를 얻기 위해 trunc 기능을 사용할 수 있습니다 날짜 열을 작동 할 때 기본적 trunc으로

SELECT * FROM TEST_DATE WHERE trunc(EMP_DATE) = trunc(SYSDATE); 

이 날짜의 시간 부분을 제거합니다. 이 쿼리를 최적화하려면 일반적으로 trunc(emp_date)의 기능 색인을 권장합니다. 다음과 같이 표시합니다.

이 기능을 구현하기 위해 조금만 구현했습니다.

추가 문제가 있습니다. 오라클은 ANSI 날짜 리터럴을 지원하지만 두 번째 쿼리는 잘못되었습니다. 항상, 명시 적으로 to_date 함수를 사용하여 날짜로 문자열로 변환하십시오.

SELECT * FROM TEST_DATE WHERE EMP_DATE = to_date('01-07-2012','dd-mm-yyyy'); 

내가 사용했던 mmdatetime format model 대신 JUL 항상 7 월 평균 것이라는 보장이 없기로 mon; NLS 매개 변수, 특정 데이터베이스 또는 세션이 사용하는 "날짜 언어"에 따라 다릅니다. datetime 형식 모델은 전달하는 문자열의 형식을 날짜로 변환하도록 데이터베이스에 지시하는 방법입니다.


당신이 관심이 있다면 두 번째 쿼리에 대한 ANSI 구문은 다음과 같습니다

SELECT * FROM TESt_DATE WHERE trunc(EMP_DATE) = DATE '2012-07-01' 

그것은 작업이 형식 (YYYY-MM-DD)에 있어야합니다.

+0

귀하의 제안에 감사드립니다! 그래서 SYSDATE를 사용하여 날짜를 삽입하면 날짜와 시간에 따라 적절하게 저장됩니다. 동일한 결과를 얻으려면 날짜를 truncation해야합니까? – Aspirant

+0

@Aspirant, 그 날에 _every_ 결과를 원한다면, 예. 'sysdate'가 레코드를 삽입하고 그것을 선택하려고하자마자 끊임없이 변화한다는 것을 잊지 마라.'sysdate'는 몇 초 후에 "똑딱 거리고"날짜는 똑같이 변하지 않을 것이다. 주변에 놀고 너 자신을 위해보십시오 : -) – Ben

관련 문제