3

我在 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 MOVEMENTON。

4

2 回答 2

0

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

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

于 2013-06-05T12:48:27.250 回答
0

问题在于分区。我在EXCHANGE PARTITIONS没有验证的情况下进行了一些操作,因此很少有记录被放置在不正确的分区上(不在其范围内)。在这种情况下比较并SELECT DISTINCT没有正确工作。

于 2013-06-06T08:20:30.053 回答