2013-06-05 4 views
3

나는 오라클에 DATE 컬럼을 가진 테이블을 가지고 있습니다.왜 SELECT DISTINCT가 동일한 값을 두 번 반환합니까?

select distinct myDate from myTable; 

myDate 
---------------------------- 
2009-09-05 00:00:00   
2009-09-05 00:00:00 

:하지만

select distinct to_char(myDate, 'DD-MM-YYYY HH24:MI:SS') from myTable; 

TO_CHAR(myDate,'DD-MM-YYYYHH24:MI:SS') 
------------------------------------------------ 
05-09-2009 00:00:00 

그리고 다음 쿼리, 자세한 내용을 알 수 있습니다 :

select count(*) from myTable; 

    COUNT(*) 
---------- 
     12 

select myDate, count(*) from myTable group by myDate; 

myDate      COUNT(*) 
---------------------------- ---------- 
2009-09-05 00:00:00     6 
2009-09-05 00:00:00     6 


select count(*) from myTable where myDate='2009-09-05'; 

    COUNT(*) 
---------- 
     6 

어떻게 그런 행동의 이유가 될 수 있습니다 나는 SELECT DISTINCT 중복을 반환하는 것을 관찰 할 수 있습니까? 내가 아는 한, 차이를 만들 수있는 DATE 열에 더 이상 정보가 저장되어 있지 않습니다 (시간대 없음, 밀리 초 없음).


편집 : 테이블 DDL

불행히도 나는 모든 DDL을 게시 할 수 없습니다. 컬럼의 정의는 다음과 같습니다 중요 할 수 있습니다 무엇

myDate DATE NOT NULL 

는 테이블이 열을 사용하여 분할 :

PARTITION BY RANGE (myDate) 
(
PARTITION P_19991231 VALUES LESS THAN 
    (TO_DATE('1999-12-31 00:00:00', 
      'YYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
); 

테이블에서 더 많은 파티션이있다.

또한 ENABLE ROW MOVEMENT이 켜져 있습니다.

+0

테이블 스키마를 제공 할 수 있습니까? – Farlan

+0

SQL * Plus의 NLS 형식을 변경하여 *** 및 *** 시간을 표시하는 이유는 무엇입니까? –

+0

@a_horse_with_no_name 변경하고 내 질문을 편집했습니다. 그러나 그것은 아무것도 (적어도 나를 위해) 보여줍니다. – psur

답변

1

문제가있는 파티션입니다. EXCHANGE PARTITIONS 작업을 유효성 검사없이 수행 한 결과 거의 틀린 파티션 (해당 범위 아님)에 기록이 거의 저장되지 않았습니다. 이러한 상황에서는 SELECT DISTINCT이 올바로 작동하지 않았습니다.

0

정밀도 문제 : 초 후에 밀리 초가 발생합니다. 같은 초에 날짜가있는 2 개의 행을 테이블에 가지고 있지만 동일한 밀리 초가 아닙니다. 날짜에 대해 SELECT DISTINCT을 실행하면 별개이므로 2 행이 있습니다. 그러나 to_char 함수를 사용하면 날짜를 초로 반올림하고 하나의 행만 리턴합니다.

날짜별로 그룹화하려면 날짜가 이고 정확히이어야합니다.

+1

'DATE' 유형에 밀리 초가 있습니까? 내가 아는 한 초에 끝납니다 : http://stackoverflow.com/questions/9180014/using-oracle-to-date-function-for-date-string-with-milliseconds – psur

+0

이것을 실행하십시오 :'select 별개의 to_char (myDate, 'DD-MM-YYYY HH24 : MI : SS.FF3') from myTable; FF는 초의 분수를 나타냅니다. – eternay

+0

'날짜 형식을 인식 할 수 없음 ' – psur

관련 문제