2009-11-23 5 views
1

이 같은 SQL 쿼리가 있습니다.oracle 10g 데이터베이스를 사용하는 SQL 쿼리는 datetime equal not working

select * 
from TABLE_A 
where LogDateTime >= startdatetime and LogDateTime <= enddatetime; 

하지만 enddatetime equal은 작동하지 않습니다. 날짜가 11/23/09 8:50:09 인 기록이 있습니다. enddatetime을 11/23/09 8:50:09로 선택하면이 레코드가 반환되지 않습니다. 그것은 8.49 : 59까지 돌아오고 있습니다. 무엇이 문제 일 수 있습니까? 타임 스탬프가 작동하지 않는 이유는 무엇입니까? 저에게 알려주세요.

고맙습니다.

답변

1

enddatetime은 어떤 데이터 유형입니까? 이것이 타임 스탬프라면 전달하는 변수의 유형 (DateTime)과 테이블의 데이터 유형 (Timestamp) 사이에 불일치가있을 수 있습니다. 정확히 일치하는 타임 스탬프 값이 없기 때문에 발생할 수 있습니다 날짜 시간 값 ... 가장 가까운 사용 가능한 값은 레코드가 필터링되는 방향으로 "off"일 수 있습니다.

1

TIMESTAMP 데이터 유형의 LogDateTime입니까? 초의 분수 부분을 저장합니다. 아마도 귀하의 날짜는 정확히 11/23/09 8:50:09이 아닙니다.
TO_CHAR(LogDateTime,'MM/DD/YYYY HH24:MI:SS.FF')을 사용하여 날짜 출력을 시도해보십시오.

+0

예 TIMESTAMP (6)입니다. – nav100

+0

그러면 Andomar의 제안처럼 반올림이 필요합니다. –

+0

조금 생각한 후에 나는 아마도 반올림 할 필요가 없다고 결론을 내 렸습니다. 귀하의 쿼리가 정확합니다, 당신은 날짜가 평등하지 않으므로 실제로는 문제가 아니라는 것을 알고 있습니다. –

3

오라클은 datetime을 8:49:59.200과 같이 더 높은 정밀도로 저장할 수 있습니다. 그것은 8:49:59보다 크지 만 동일하게 표시됩니다.

이 시도 WHERE 절 :

LogDateTime < (enddatetime + INTERVAL '1' SECOND) 

이 여전히 enddatetime로 두 번째 같은 시작을 가지고 아무 것도 포함됩니다.

+0

이 절이 작동하는 것처럼 보입니다. 그러나 그것은 어떤 문제를 유발합니까? 우리가 두 번째 권리를 추가하기 때문에? – nav100

+0

@ nav100 : 초를 추가하고'<='를'<'로 바꾸면'8 : 49 : 59.000' 대신에'8 : 49 : 59.999'까지 선택합니다. – Andomar