char到date的隐式转换过程中,必须保证其格式是本机的默认时间格式你可以先ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD',再执行插入
不过还是建议to_date方式

解决方案 »

  1.   

    这个和数据库默认的日期格式有关,你可以通过 select * from V$NLS_PARAMETERS;查看NLS_DATE_LANGUAGE的值。(而且这个是SESSION级别的)
    比如我当前session的NLS_DATE_LANGUAGE='SIMPLIFIED CHINESE',那么我直接可以用'12-4月-2013'的字符串格式插入到一个DATE类型的column中。
    其实你也可以新开一个窗口建立一个新的SESSION,并且修改这个SESSION的NSL_DATE_LANGUAGE值为AMERICAN:ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';现在你可以在这个窗口中直接插入'12-JAN-2013'格式的字符串到DATE的COLUMN
      

  2.   

    #3的方法也很好,直接改当前SESSION的格式
      

  3.   

    谢谢回答!但是用的是同一个数据库,在客户端中直接执行这个SQL在不同的机器上都是没有问题的。但是在java程序中执行,连同一数据库,为什么有的机器上可以,有的机器上不行?
      

  4.   

    谢谢回答!但是用的是同一个数据库,在客户端中直接执行这个SQL在不同的机器上都是没有问题的。但是在java程序中执行,连同一数据库,为什么有的机器上可以,有的机器上不行?
    Sorry,我都不怎么会JAVA,但是我觉得有可能是操作系统影响,首先你必须保证每个客户端的日期格式是一样的
      

  5.   

    谢谢回答!但是用的是同一个数据库,在客户端中直接执行这个SQL在不同的机器上都是没有问题的。但是在java程序中执行,连同一数据库,为什么有的机器上可以,有的机器上不行?
    Sorry,我都不怎么会JAVA,但是我觉得有可能是操作系统影响,首先你必须保证每个客户端的日期格式是一样的
    操作系统的语言不同有关系吗?
      

  6.   

    谢谢回答!但是用的是同一个数据库,在客户端中直接执行这个SQL在不同的机器上都是没有问题的。但是在java程序中执行,连同一数据库,为什么有的机器上可以,有的机器上不行?
    Sorry,我都不怎么会JAVA,但是我觉得有可能是操作系统影响,首先你必须保证每个客户端的日期格式是一样的
    操作系统的语言不同有关系吗?
    怕有些全英文版的不支持中文字符
      

  7.   

    在java中先把 ‘2013/12/23’字符串转为为date类型,然后插入。
    DateFormat formate = new java.text.SimpleDateFormat("yyyy/MM/dd");
    java.util.Date date = formate.parse("2013/12/23");
    java.sql.Date sqlDate = new java.sql.Date(date.getTime());
      

  8.   

    +1
    还是 建议先自己手动转换为sql.Date。
      

  9.   

    现在就是不想改任何代码,我还是怀疑是环境问题。因为是连的同一个数据库,在客户端直接运行也没问题,只是在不同的机器上用相同的java程序跑有的会出错,有的不会错。但是不知道是环境的哪里不对。其实在真实的环境中运行也没有任何问题,只是在测试环境中,在有的机器上会出问题。谢谢!
      

  10.   

    varchar2或者char到date能否进行隐式转换,取决于你输入字符串的格式是否是本session的时间格式(这个每个客户端机器都可以自己设,PL/SQL工具选项Tools-Preferences-NLS Options-Date或者glogion.sql或者注册表等),这样就有可能你一个格式在不同机器不同窗口插入会有不一样的结果;
    可以通过select * from V$NLS_PARAMETERS where parameter='NLS_DATE_FORMAT'来看到格式,也可以修改,然后再对应格式插入