TNCS01表中有两个符合日期格式的字符字段:JKM和BCM,但执行以下语句就报日期格式出错:
ORA-01841: (full) year must be between -4713 and +9999, and not be 0 
该语句原来运行在程度中一直非常正常,并且在另一台数据结构完全一样的服务器中运行该语句执行成功。select * from (select * from TNCS01 where DMLB='NSSBBD' and DM='0101') A where to_date('2008.06.01','YYYY.MM.DD') between to_date(JKM,'YYYY.MM.DD') and 
to_date(BCM,'YYYY.MM.DD')

解决方案 »

  1.   

    估计你的表中存在非法数据。比如jkm or BCM='0'
      

  2.   

    我敢保证,绝对不存在在JKM和BCM中存在非法日期值,查询结果如下:
    JL_HM   DMLB    DM      DMMC            JKM             BCM
    811 NSSBBD 0101 DSB011001 1900.01.01 2222.12.31
    812 NSSBBD 0101 DSB012001 1900.01.01 2222.12.31
    813 NSSBBD 0101 DSB010001 1900.01.01 2222.12.31
    814 NSSBBD 0101 DSB015001 1900.01.01 2222.12.31
    815 NSSBBD 0101 DSB016001 1900.01.01 2222.12.31
    816 NSSBBD 0101 DSB017001 1900.01.01 2222.12.31
      

  3.   

    删除该表后重新用imp倒入,以上语句能够正确执行,原以为问题已解决.但执行下列语句时又发现一个新问题:从里向外第一层和第二层sql均可成功执行,但第三层(最外层)执行则报错:
    ORA-01841: (full) year must be between -4713 and +9999, and not be 0 感觉是嵌套层数超过三层后才出现这个奇怪的错误select DM,DMMC from 
    (
      select DM,DMMC,to_date(JKM,'YYYY.MM.DD') as SSSQ_Q,to_date(BCM,'YYYY.MM.DD') as SSSQ_Z from 
      TNCS01 where DMLB='NSSBBD' and dm in 
      (
         select SBLX_DM from TNSB01 where NSRDZDAH=500105000001247173 and 
         ((to_date('2008.06.01','YYYY.MM.DD') Between  YXQ_Q and YXQ_Z) or YXQ_Z is null)
      )

    TNCS01 where to_date('2008.06.01','YYYY.MM.DD') Between SSSQ_Q and SSSQ_Z 
      

  4.   

    是不是与执行select嵌套查询相关的环境条件出问题了?
      

  5.   

    为什么要用to_date(JKM,'YYYY.MM.DD') as SSSQ_Q,to_date(BCM,'YYYY.MM.DD') as SSSQ_Z
    JKM,BCM本来就是date,用to_char()应该就不会报错了
      

  6.   

    ORA-01841 应该还是数据的问题。如果你用的PLSQL Developer或者SQL Tools这样的工具(包括toad), 它的查询默认只取第一页的结果集, 而不是把整个查询执行完, 后面有错误的记录可能还没有被扫描到.
    而你加了另一个条件之后, 可能第一页就扫描到错误的记录了.
    所以中间两层不报错,而第三层报错。