Oracle日期类型Date和timestamp需要注意的地方

   Oracle中,常用的日期类型有Date和timestamp,当表定义好之后,写SQL需要注意什么问题呢?来做一个实现:

drop table test  purge;

drop table test1 purge;
create table test
(
  id number,
  create_time date
);
create table test1
(
  id number,
  create_time timestamp
);
insert into test  select level, sysdate-(level*0.001) from dual connect by level <10000;
commit;
insert into test1  select level, sysdate-(level*0.001) from dual connect by level <10000;
commit;
create index ind_t_create_time on test(create_time);
create index ind_t1_create_time on test1(create_time);
exec dbms_stats.gather_table_stats(user,'test',cascade => true);
exec dbms_stats.gather_table_stats(user,'test1',cascade => true);

SQL> set autotrace traceonly
SQL> select *  from test  where
      create_time >= to_date('2016-10-26 10:03:46', 'yyyy-MM-dd HH24:mi:ss');
已选择48行。
已用时间:  00: 00: 00.02
执行计划
----------------------------------------------------------
Plan hash value: 1822039520
-------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                   |    49 |   588 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST              |    49 |   588 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T_CREATE_TIME |    49 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("CREATE_TIME">=TO_DATE(' 2016-10-26 10:03:46', 'syyyy-mm-dd hh24:mi:ss'))
统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         11  consistent gets
          0  physical reads
          0  redo size
       1452  bytes sent via SQL*Net to client
        505  bytes received via SQL*Net from client
          5  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         48  rows processed

SQL> select *  from test  where
      create_time >= to_timestamp('2016-10-26 10:03:46', 'yyyy-MM-dd HH24:mi:ss');
已选择48行。
已用时间:  00: 00: 00.01
执行计划
----------------------------------------------------------
Plan hash value: 1357081020
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   500 |  6000 |     9   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TEST |   500 |  6000 |     9   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(INTERNAL_FUNCTION("CREATE_TIME")>=TIMESTAMP' 2016-10-26
              10:03:46.000000000')
统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         35  consistent gets
          0  physical reads
          0  redo size
       1316  bytes sent via SQL*Net to client
        505  bytes received via SQL*Net from client
          5  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         48  rows processed

SQL> select *  from test1  where
      create_time >= to_date('2016-10-26 10:03:46', 'yyyy-MM-dd HH24:mi:ss');
已选择48行。
已用时间:  00: 00: 00.01
执行计划
----------------------------------------------------------
Plan hash value: 3941734091
--------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                    |    49 |   735 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST1              |    49 |   735 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T1_CREATE_TIME |    49 |       |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("CREATE_TIME">=TIMESTAMP' 2016-10-26 10:03:46')
统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         11  consistent gets
          0  physical reads
          0  redo size
       1452  bytes sent via SQL*Net to client
        505  bytes received via SQL*Net from client
          5  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         48  rows processed


SQL> select *  from test1  where
      create_time >= to_timestamp('2016-10-26 10:03:46', 'yyyy-MM-dd HH24:mi:ss');
已选择48行。
已用时间:  00: 00: 00.01
执行计划
----------------------------------------------------------
Plan hash value: 3941734091
--------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                    |    49 |   735 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST1              |    49 |   735 |     3   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T1_CREATE_TIME |    49 |       |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("CREATE_TIME">=TIMESTAMP' 2016-10-26 10:03:46.000000000')
统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         11  consistent gets
          0  physical reads
          0  redo size
       1452  bytes sent via SQL*Net to client
        505  bytes received via SQL*Net from client
          5  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         48  rows processed

    总结:如果字段类型是date,SQL查询是条件右值如果是to_date则可以用到索引,如果是to_timestamp是用不到索引的;如果字段类型是timestamp,SQL查询是条件右值如果是to_date或to_timestamp都是可以用到索引的。注意的是to_date(create_time)如果在左值上是肯定用不上索引的。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值