oracle表t里一个时间字段dt为date类型。我要查找某一天(2010-05-10)的数据,下面哪种方式效率高?
1.
select * from t where to_date(dt) = to_date('2010-05-10','yyyy-mm-dd') 
2.
select * from t where dt between to_date('2010-05-10','yyyy-mm-dd') and to_date('2010-05-10','yyyy-mm-dd') + 1;
3.
select * from t where dt >= to_date('2010-05-10','yyyy-mm-dd') and dt < to_date('2010-05-10','yyyy-mm-dd') + 1;
谢谢大家。

解决方案 »

  1.   

    dt上有索引没?
    个人感觉下面会好些
    select * from t where to_char(dt,'yyyy-mm-dd') ='2010-05-10';
      

  2.   

    方便的话 自己看下执行计划吧
    只看时间的话 在sqlplus中先set timing on;
    再执行下 结果就一目了然了
      

  3.   


    -- 效率都会很低,为什么左、右两边都要用to_date函数呢?那两边都不用(那样效率不是更高?),不是一回事吗?
      

  4.   

    -- 不解:dt已经为date类型的了,还用to_date()函数,就不会报错?
      

  5.   

    -- 提示:函数应尽量放在条件等式的右边,
    -- 这样:如果dt字段有索引的话,就会用到此索引,这样效率才是最高的!
    -- 例如:查询'2010-05-10'这一天的数据,查询语句如下所示:select * from t 
    where dt >= to_date('2010-05-10','YYYY-MM-DD')
    and dt < to_date('2010-05-11','YYYY-MM-DD');
      

  6.   

    对于时间字段 用天的话 可以用trunc
      

  7.   

    为什么不可以??只要格式符合session的nls_date格式都行,这就是oracle的自动类型转换如果经常有这种需求,你的dt肯定要建立索引的,所以不能对左值进行函数或防止它自动类型转换,右值转为date类型即可
      

  8.   

    PLSQL如果你有这工具的下面自动提示查询时间。然后自己看一下就知道了
      

  9.   

    我难道眼花了?
    select * from t where dt = to_date('2010-05-10','yyyy-mm-dd')  
    不需要在dt前头加to_date了。
    dt是日期字段,建上索引,应该so快了。
      

  10.   

    dt虽然是date类型 但是它里面是有时分秒的 我只要年月日