我的查询看起来像这样:
select datesent, count(*) the_count from receivedmessaged where status=5000
and datesent>(to_date('20130101', 'YYYYMMDD')) group by datesent
我正在寻找的是一张表,其中包含每天状态为5000的消息计数,比某个日期更新。我得到的是一张一遍又一遍的相同日期的桌子。我认为正在发生的是,该datesent字段中有一个隐藏的时间部分,它按照发送的确切时间对条目进行分组,而不是仅查看日期。谁能证实这一点并告诉我如何解决它?谢谢!
答案 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))
。您只需在查询中使用此虚拟列。为了提高性能,如果需要,您可以创建索引。
注意:针对虚拟列定义的索引等效于基于函数的索引。