今天我在oracle 10g下用to_date(parameter,'yyyy-mm-dd hh24:mi:ss')作为检索条件,在公司内部测试的时候没有问题
可是在用户处测试在执行该SQL文时会异常,提示无效的月份,而且是有的机子会异常,有的不会。
      小弟刚入行,希望各位大哥给指点指点!

解决方案 »

  1.   

    说明表中的数据有非正常的数据,比如parameter='20081918 21:10:30'
    把不正确的数据修改正确后就可以了。
      

  2.   

    同楼上,还有可能就是格式不对,parameter里并非存储格式为'yyyy-mm-dd hh24:mi:ss'的字符串
    比如某个字符串为 09/18/08 20:00:00
    这样你的转换就不对了
      

  3.   

    有的同事建议不用TO_DATE转换数据,在后台里将参数直接转换为DateTime类型再传入数据库操作。
    用户那边下班了,没来的及试,不知道行不行
      

  4.   

    难道说是客户那边的oracle使用的时间格式不一样?
      

  5.   

    很有可能,最常见的错误就是to_char(date,'yyyy-mon-dd hh24:mi:ss')这样转换出来受字符集的影响
    为什么不用date型呢?date型也就7个字节,varchar保存日期肯定超过7个字节的,而且容易格式错误
      

  6.   

     从有的机器可以,有的不可以看,应该是客户端的日期格式设置的跟你的to_date中指定的不一致;可以通过控制面板中的区域设置把日期格式设置下,应该就可以了。
    ps:说白了还是代码写的有问题,没有对parameter参数进行固定的格式转换。
      

  7.   

    库里是DATE型,后台是把string型的日期作为参数传给SQL文所以才要转换啊,是不是不同版本的ORCALE 10g的日期格式不一样呢
      

  8.   

    从库中读出的数据确实在后台里格式和在库里不一样,比如库里是2008-09-18 而在后台作为string时是2008-9-18,但是在公司的机子里只要在SQL文中TO_DATE一下就没问题啊
      

  9.   


    那就是某个机器日期格式设置的问题了。我更习惯于用to_char转换,然后统一用char做比较。
    另外,我们公司的开发规定,对oracle的软件开发,涉及日期时间的一律用varchar2。
      

  10.   

    我认为还是你的程序对 parameter传入的有问题,举个例子:在你自己的机器上给parameter传的可能是'2008-09-18',在客户机的机器上却是传了'20080918',这样肯定会报无效的月份错误,我是吃过这方面的亏的,是因为你和客户的机器时间区域的日期格式不一样,不要用程序的datetime.toString等之类函数来传,最好是格式化写死字符串后再传到arameter,这个在任何的机器上都不会有问题.不知道我说明白了没有?
      

  11.   

    用这种方式试试看:
    SQL> SELECT TO_DATE('13-JAN-2008','DD-MON-YYYY','NLS_DATE_LANGUAGE=AMERICAN') "MY_DATE" FROM DUAL;MY_DATE
    -----------
    1/13/2008SQL> 
      

  12.   

    11 楼的意思是从库中读出来的时候用to_char转化成想要的形式,用的时候再用to_date转化成日期类型吗?不知道是不是这样理解,10楼说的库里日期用VARCHAR从来都没听说过
      

  13.   

    试一下:   在客户端的注册表HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0中,如无系统变量NLS_DATE_FORMAT,则“新建”->“字符串”,重命名为“NLS_DATE_FORMAT”,赋值为:“YYYY-MM-DD HH24:MI:SS”。