2013-06-05 49 views
3

我在Oracle中有一個表,它有DATE列。我可以觀察到SELECT DISTINCT返回重複:爲什麼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 

什麼可這種行爲的原因是什麼?據我所知,沒有更多的信息存儲在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

精度問題:秒後,您有毫秒。你的表中有兩行的日期在同一秒,但不是相同的毫秒。當你對日期執行SELECT DISTINCT時,它們是不同的,所以你有2行。但是使用to_char函數,您將日期舍入到秒數,並且只返回一行。

要按日期分組,您必須確定日期是,確切地說是一樣的。

+1

你確定'DATE'類型有毫秒嗎?據我所知,它結束秒:http://stackoverflow.com/questions/9180014/using-oracle-to-date-function-for-date-string-with-milliseconds – psur

+0

嘗試執行此:'選擇myTable不同於to_char(myDate,'DD-MM-YYYY HH24:MI:SS.FF3');'。 FF表示秒的分數。 – eternay

+0

我收到'date format not recognized' – psur

相關問題