【问题标题】:"group by day" in Oracle doesn't appear to group by dateOracle 中的“按天分组”似乎没有按日期分组
【发布时间】:2014-09-29 18:03:43
【问题描述】:

我的查询如下所示:

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

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

【问题讨论】:

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

标签: oracle date


【解决方案1】:

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

这很可能是正在发生的事情。所以试试吧:

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

【讨论】:

  • 由于索引问题,我曾因尝试使用 trunc 而被大喊大叫。我假设这会很好,因为我只是截断结果?
  • 我不知道你的表是如何被索引的。但也许你应该考虑使用function-based index
【解决方案2】:

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

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

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

【讨论】:

  • +1 如果 OP 有权访问/允许修改架构,则添加 VIRTUAL 列绝对是一个好主意。
  • 是的,OP 应该具有所需的权限。
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2015-09-08
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多