【问题标题】:Oracle sql a column having number datatype using BETWEENOracle sql 使用 BETWEEN 具有数字数据类型的列
【发布时间】:2011-06-05 03:37:08
【问题描述】:

伙计们,我有一个表,其中列 st_date 包含数据类型为数字的日期,值将类似于 20101201 即 (01-DEC-2010)

如果我使用 between 子句为边界之间的日期编写选择查询,我的问题是是否使用 between 或 less 或 greater than 运算符,这是高效的。

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

该表有数百万条记录,按 st_date 分区。高于或低于一个。

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

请告诉我你的答案。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

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

    在内部,between 被重写为 >= 和

    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。

    想想这对基数估计有什么影响。

    【讨论】:

      【解决方案2】:

      BETWEEN 是包容性的。这意味着&gt;= 下和&lt;= 上。

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

      BETWEEN 的使用更加清晰。

      【讨论】:

        【解决方案3】:

        正如 Mitch Wheat 在他的 answer 中所说,在将第二个查询的第 3 行修复为

        where st_date >= 20101101 AND st_date <= 20101130 
        

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

        我个人在需要定义时间/日期间隔时使用BETWEEN

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-09
          • 2013-01-05
          • 1970-01-01
          相关资源
          最近更新 更多