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

时间:2016-09-20 20:21:56

标签: oracle date truncate

有没有办法在不使用截断功能的情况下从日期字段中选择月份的第一个月?它太慢了我的查询速度。我在这样的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()。那是一个错误,并没有在实际的完整查询中使用。

1 个答案:

答案 0 :(得分:5)

还有其他方法可以获得本月的第一天约会。但这些方法不再有效。几乎可以肯定,问题的根源在于date_field上有一个索引。当您使用date_field而没有任何函数调用时,Oracle可以使用该索引并且您的查询是有效的。但是,只要在date_field周围进行任何函数调用,Oracle就不能再使用该索引,因此您会遇到效率低得多的查询计划。问题不在于trunc很慢,问题是在索引列上放置任何函数调用都会阻止使用该索引。

鉴于此,您有两种选择

  1. trunc(date_field, 'MM')上创建基于函数的索引,并保持查询不变。
  2. 重新构建查询,以便在date_field没有函数
  3. 的情况下具有条件

    这样的东西
    where date_field >= :v_Month
      and date_field <  add_months(:v_Month,1)