为什么SELECT DISTINCT返回相同值的两倍?

时间:2013-06-05 12:45:00

标签: sql oracle date select distinct

我在Oracle中有一个表,其中包含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 

这种行为的原因是什么?据我所知,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已开启。

2 个答案:

答案 0 :(得分:1)

问题在于分区。我做了很少EXCHANGE PARTITIONS次操作而没有验证,因此很少有记录放在不正确的分区上(不在其范围内)。在这种情况下,比较和SELECT DISTINCT无效。

答案 1 :(得分:0)

精度问题:在秒之后,你有几毫秒。你的表中有2行,日期在同一秒,但没有相同的毫秒。当您对日期执行SELECT DISTINCT时,它们是不同的,因此您有2行。但是使用to_char函数,您可以将日期四舍五入到秒,并且只返回一行。

要按日期分组,您必须确保日期完全相同。