oracle字符串类型的时间数据进行直接比较,会隐式转换吗?
比如数据库有个栏位createtime,类型为varchar2(50),单里面的数据为时间格式的,
比如:‘2011/11/10’
查询时可以直接用一个时间字符串进行比较
select * from tb where createtime > '20111109';
是可以获取正确的结果集的,想知道这里是先讲createtiem和后面的'20111109'隐式转换转换成date类型,再比较,还是直接比较的字符串的位置ASCII?
还有就是如果栏位为date类型,进行比较应该会比varchar2类型进行比较检索效率要高吧。

解决方案 »

  1.   

    首先纠正几个问题:
    (1)select * from tb where createtime > '20111109'
    如果想要这个条件满足的话,tb表里的createtime不能写成'2011/11/10'这种格式的,只能写成'20111110',因为'2011/11/10'不大于'20111109',只有'20111110'才大于'20111109'。
    (2)比较的时候,是不会自动转换成date类型的,是挨个字符比较它的ACSII码。
    所以说'2011/11/10'不大于'20111109',因为前四个字符都是2011,肯定是相等的;比到第5个字符的时候,用'/'和'1'比较,而select 1 from dual where '/' > '1'是不成立的,说明'/' 小于 '1', 所以'2011/11/10'就小于'20111109'
      

  2.   

    如果在createtime字段上建立索引,
    在两种情况下:
    a.createtime varchar2(50)
    b.createtime date
    下面两句的执行计划是一样的:
    select * from tb where createtime > '20111109';
    select * from tb where createtime > to_date('20111109', 'yyyymmdd');
      

  3.   

    纠正自己写错的一个地方【select * from tb where createtime > '20111109'】是想表达的【select * from tb where createtime > '2011/11/09'】,忘记写上【/】了
      

  4.   

    1. 建立的字段类型如果为VARCHAR2(50),比较的当然是ASCII码。
    2. 如果建立的字段类型是Date,比较的实质是一个数值。是从一个基准开始到你的时间数据的数值。
    3. 至于比较的效率,无法考证。
      

  5.   

    隐式转换转换成date类型?oracle貌似没这么智能吧
    楼主的语句是直接当做字符串来比对的。
      

  6.   

    to_date,我觉得可能是直接日期比较。