如何在没有TRUNC的情况下从日期字段中选择月的第一天



是否有办法从日期字段中选择每月的第一天而不使用trunc函数?它拖慢了我的查询速度。我把它放在where子句中,像这样:

WHERE trunc(DATE_FIELD, 'MM') = :v_Month 

查询在没有trunc函数的情况下运行4秒,但返回一个不完整的数据集。使用trunc函数将返回所有数据,但是查询将花费20多分钟来运行。

DATE_FIELD在一个月有很多天,但我只需要每月的第一个记录。因此,如果DATE_FIELD = 14/09/2016,我需要以某种方式获得01/09/2016,但不使用trunc。

这可能吗?

更新:

从代码中删除了to_date()。这是一个错误,并没有在实际的完整查询中使用。

还有其他方法可以将日期定在每月的第一天。但这些方法不会更有效。几乎可以肯定,问题的根源在于date_field上有一个索引。当您使用date_field而不调用任何函数时,Oracle可以使用该索引,并且您的查询是有效的。一旦你把任何函数调用围绕date_field,然而,Oracle不能再使用该索引,所以你被困在一个效率低得多的查询计划。问题不是trunc慢,问题是在索引列上放置任何函数调用都会阻止该索引的使用。

考虑到这一点,你有两个选择

  1. trunc(date_field, 'MM')上创建基于函数的索引,保持查询不变
  2. 重新制定查询,使您在date_field上有条件而不需要函数

之类的
where date_field >= :v_Month
  and date_field <  add_months(:v_Month,1)

相关内容

  • 没有找到相关文章

最新更新