是否有办法从日期字段中选择每月的第一天而不使用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
慢,问题是在索引列上放置任何函数调用都会阻止该索引的使用。
考虑到这一点,你有两个选择
- 在
trunc(date_field, 'MM')
上创建基于函数的索引,保持查询不变 - 重新制定查询,使您在
date_field
上有条件而不需要函数
where date_field >= :v_Month
and date_field < add_months(:v_Month,1)