SELECT count(*) FROM test where (test.BEDAT) > '2000/01/01'SELECT count(*) FROM test where TO_DATE(test.BEDAT) > '2000/01/01' BEDAT在数据库中是verchar类型,请问这两种方法有什么区别?

解决方案 »

  1.   

    你的BEDAT应该是是字符串类型的吧。
    那如果不使用TO_DATE(),比较的就是两个字符的ASCII值大小,而不是日期。
    像第二句加了TO_DATE(),之后的'2000/01/01'就会隐式转换成日期格式,从而进行日期的比较。
      

  2.   

    SQL> select TO_DATE('2000/01/01','yyyymmdd') from dual;select TO_DATE('2000/01/01','yyyymmdd') from dualORA-01858: a non-numeric character was found where a numeric was expected 
     能这样吗?
      

  3.   


    什么意思?
    select TO_DATE('20000101','yyyymmdd') from dual;
    这个可以的
      

  4.   

    数据类型是verchar2类型的,格式就是“20000101”格式的
      

  5.   

    如果都是字符型,那还是像我所说的那样,没有进行日期比较,只是结果刚好与你的吻合而已。
    建议以后还是先对字符类型的进行TO_DATE()再比较,以免发生不必要的问题。
      

  6.   

    select ascii('20000101'),ascii('2000/01/01') from dual;
    可以看到他们的ASCII值是一样的,所以才会使你>'2000/01/01'和>'20000101'的写法有一样的结果
      

  7.   


    如果不进行TO_DATE()转换,可能会出现什么问题?
      

  8.   


    但是如果数据库中的数据格式是“2000/01/01”,类型还是vercgar2,这样比较的话两条语句的结果是不一样的,为什么?
      

  9.   

    我不知道你的不同体现在那里。
    但是,如果数据类型都是varchar2,是不会涉及到数据转换的,日期比较就更别说了。
      

  10.   

    第一条语句:只是单纯的使用字符串的比较按你后面写的'2000/01/01'想必你的BEDAT在数据库中也是以'YYYY/MM/DD'的格式存储的,只是字符串比较而已没什么可讲的。
    你的第二条语句:在BEDAT上使用了函数to_date,我都怀疑你的语句能否执行成功,不同类型的值是不可以进行比较的要比较日期必须两边都是日期类型.