2014-09-29 28 views
2
似乎组

我的查询看起来是这样的:“组按天”在Oracle不按日期

select datesent, count(*) the_count from receivedmessaged where status=5000 
and datesent>(to_date('20130101', 'YYYYMMDD')) group by datesent 

我正在寻找的是具有消息的计数和状态的表每天5000个,比某个日期更新。我所得到的是一张一张地重复同一日期的表格。我认为发生的事情是在该日期字段中存在隐藏时间部分,并且按照发送的准确时间对条目进行分组,而不是仅仅查看日期。任何人都可以证实这一点,并告诉我如何解决它?谢谢!

+0

从上面我们可以假设'datesent'列的类型是'date',因为您将它与'to_date'函数的返回值进行比较。 'date'数据类型中没有隐藏时间部分,但时间部分是该类型的重要部分。 – user272735 2014-09-30 08:41:40

回答

3

我认为发生的事情是该datesent字段中存在隐藏时间部分,并且按照发送的确切时间对条目进行分组,而不仅仅是查看日期。

这很可能是发生了什么事。所以尝试:

select TRUNC(datesent), count(*) the_count from receivedmessaged where status=5000 
and datesent>(to_date('20130101', 'YYYYMMDD')) group by TRUNC(datesent) 

TRUNC将天去掉“部分时间”,让你组。


请注意,使用TRUNC将无效您的索引。看看你的执行计划。如果需要,您应该在TRUNC(datesend)上添加function-based index

+0

由于索引问题,我一直在试图使用trunc之前大吼大叫。我认为这样会很好,因为我只是在扼杀结果? – will 2014-09-29 18:11:14

+0

这似乎工作,顺便说一句。 – will 2014-09-29 18:12:58

+0

我不知道如何索引你的表。但也许你应该考虑使用['基于函数的索引'](http://www.oracle-base.com/articles/8i/function-based-indexes.php)? – 2014-09-29 18:20:04

1

当然,使用TRUNC可以解决您的问题,使用function-based index可以使其更有效率。

但是,从11g起,也可以使用VIRTUAL colums。就你而言,你可以添加一个虚拟列为new_date ALWAYS GENERATED AS (TRUNC(date_column))。你只需要在你的查询中使用这个虚拟列。为了提高性能,如果需要,您可以创建一个索引。

注意:根据虚拟列定义的索引等效于基于函数的索引。

+1

+1如果OP有权访问/允许修改模式,那么添加'VIRTUAL'列绝对是一个好主意。 – 2014-09-30 10:38:21

+0

是的,OP应该具有所需的权限。 – 2014-09-30 11:07:22