WHERE (DATESTART >= TO_DATE(SYSDATE,'AAAAAAAA')
这样不对吧,SYSDATE本来就是日期型的,为什么还要用to_date转换?

解决方案 »

  1.   

    TO_DATE(SYSDATE,'AAAAAAAA')这样的写法居然不报错?奇怪啊
      

  2.   

    SQL> select to_date(sysdate,'yyyy-mm-dd') from dual;
    select to_date(sysdate,'yyyy-mm-dd') from dual
                   *
    ERROR 位于第 1 行:
    ORA-01861: 文字与格式字符串不匹配
      

  3.   

    请问,如果满足除时间外的两个条件的纪录存在,oracle会报什么错误?
      

  4.   

    难道oracle是从右至左解析sql语句的吗?要看看相关资料才知道
      

  5.   

    如果没有满足另外两个条件的纪录存在的话显示顺利完成根本不报告错误,
    如果有满足另外两个条件的纪录存在的话报告错误就是to_date的问题。说明:用TO_DATE(SYSDATE,'AAAAAAAA')的目的是引进明显的错误看系统如何处理
    而原来的错误也是这里的只不过是不容易看出的
      

  6.   

    select * 
       from all_objects
      where OWNER =  'WINDOWS'
        and CREATED > to_date('2002-2-2','aaaaa');
    就是这样只要你的数据库中的对象没有属于WINDOWS的那么这句话就可以执行
    去掉第一个条件的结果如下
      1  select *
      2    from all_objects
      3*  where CREATED > to_date('2002-2-2','aaaaa')
    SQL> /
     where CREATED > to_date('2002-2-2','aaaaa')
                                        *
     ERROR 在行 3:
    ORA-01821: date format not recognized
      

  7.   

    oracle会先进行SQL语法的分析,之后才开始进行分析和执行。所以,当然报的是第三句(ORA-01821: date format not recognized)的错啦。
      你的“第一句还可以顺利执行”应为“第一句没有语法错”,还没有执行!
      

  8.   

    no,no
    老兄我说的第一句是指:
    select * from all_objects where OWNER =  'WINDOWS' and CREATED > to_date('2002-2-2','aaaaa');
    第二句是指:
    select * from all_objects where CREATED > to_date('2002-2-2','aaaaa');
    第一句在sqlpus中确实可以执行因为我的数据库中没有满足OWNER =  'WINDOWS' 的对象,一旦把它该为有的就会报错,与第二句的错误一样。所以我得出的结论是系统在开始的时候只做语法检查,语法检查通过后开始执行,一旦遇到结果集为空的情况就停止并返回,对剩下的语句不执行。
    但这也有问题:在本贴开始的时候我给出的语句有三个条件,其中不存在满足除时间外的两个条件的纪录,也就是说只执行两个条件后结果就为空就会返回,可不管对这三个条件怎样排序都不会报错。也就是说系统在执行查询是并不是按照用户给出的条件的顺序执行的。
    这些都是我自己的推论,没有任何可靠的依据。所以我想请叫高手,希望给出一个合理的有依据的结论。重要的是依据。
      

  9.   

    对不起,刚才误解了。
       你可以先在SQLPLUS下执行/oracle/rdbms/admin/utlxplan.sql存储过程,以得到PLAN_TABLE用来记录分析结果。之后执行:
    EXPLAIN PLAN for 
    select * 
       from all_objects
      where OWNER =  'WINDOWS'
        and CREATED > to_date('2002-2-2','aaaaa');
    select * from plan_table;
    就可以看到oracle的分析和执行次序、结果了
    我本地测试看到,在做完owner条件句之后,oracle不再做created句,所以不会报错!