"按天分组"在Oracle中似乎没有按日期分组

时间:2014-09-29 18:03:43

标签: oracle date

我的查询看起来像这样:

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

我正在寻找的是一张表,其中包含每天状态为5000的消息计数,比某个日期更新。我得到的是一张一遍又一遍的相同日期的桌子。我认为正在发生的是,该datesent字段中有一个隐藏的时间部分,它按照发送的确切时间对条目进行分组,而不是仅查看日期。谁能证实这一点并告诉我如何解决它?谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

但是,从11g开始,您还可以使用VIRTUAL colums。在您的情况下,您可以将虚拟列添加为new_date ALWAYS GENERATED AS (TRUNC(date_column))。您只需在查询中使用此虚拟列。为了提高性能,如果需要,您可以创建索引。

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