Oracle sql使用BETWEEN的数字数据类型的列

时间:2011-01-07 08:09:48

标签: sql oracle

我的表格中包含 st_date 列,其中包含数据类型编号的日期,值类似于 20101201,即(01-DEC-2010)

如果我使用between子句为一个位于边界之间的日期编写一个select查询,我的问题是是否使用介于或小于或大于运算符,这是性能效率。

 select id, sum(duration), sum(hit_count) 
 from A 
 where st_date between 20101101 AND 20101130 
 group by id

该表有数百万条由st_date.Is划分的记录,高于或低于1。

 select id, sum(duration), sum(hit_count) 
 from A 
 where st_date >= 20101101 AND st_date < 20101130 
 group by id

请让我知道你的答案。

3 个答案:

答案 0 :(得分:5)

第二个更高效,因为它选择的数据更少:)

在内部,between被重写为&gt; =和&lt; =。您可以在执行计划的谓词信息部分中看到它。

explain plan for select * from t1 where n between 100 and 200;

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("N">=100 AND "N"<=200)

此外,我们在此时:

不要将日期存储为数字。

Oracle知道date '2010-12-31' and date '2011-01-01'之间的差异是1天。 Oracle也知道20101231和20110101之间的区别是8870。

考虑一下对基数估计的影响。

答案 1 :(得分:4)

BETWEEN是包容性的。这意味着>=降低AND <=更高。

所以你的例子并不完全相同。假设你修复了,那么他们将生成相同的查询计划。

BETWEEN的使用更加清晰。

答案 2 :(得分:1)

正如Mitch Wheat在他的answer中所述,在修复了第二个查询的第3行之后

where st_date >= 20101101 AND st_date <= 20101130 

然后您的两个查询将生成相同的结果。 完成时间也不会有任何差异。

每当我需要定义时间/日期间隔时,我个人都会使用BETWEEN