oracle 10g to_date日期问题 今天我在oracle 10g下用to_date(parameter,'yyyy-mm-dd hh24:mi:ss')作为检索条件,在公司内部测试的时候没有问题可是在用户处测试在执行该SQL文时会异常,提示无效的月份,而且是有的机子会异常,有的不会。 小弟刚入行,希望各位大哥给指点指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 说明表中的数据有非正常的数据,比如parameter='20081918 21:10:30'把不正确的数据修改正确后就可以了。 同楼上,还有可能就是格式不对,parameter里并非存储格式为'yyyy-mm-dd hh24:mi:ss'的字符串比如某个字符串为 09/18/08 20:00:00这样你的转换就不对了 有的同事建议不用TO_DATE转换数据,在后台里将参数直接转换为DateTime类型再传入数据库操作。用户那边下班了,没来的及试,不知道行不行 难道说是客户那边的oracle使用的时间格式不一样? 很有可能,最常见的错误就是to_char(date,'yyyy-mon-dd hh24:mi:ss')这样转换出来受字符集的影响为什么不用date型呢?date型也就7个字节,varchar保存日期肯定超过7个字节的,而且容易格式错误 从有的机器可以,有的不可以看,应该是客户端的日期格式设置的跟你的to_date中指定的不一致;可以通过控制面板中的区域设置把日期格式设置下,应该就可以了。ps:说白了还是代码写的有问题,没有对parameter参数进行固定的格式转换。 库里是DATE型,后台是把string型的日期作为参数传给SQL文所以才要转换啊,是不是不同版本的ORCALE 10g的日期格式不一样呢 从库中读出的数据确实在后台里格式和在库里不一样,比如库里是2008-09-18 而在后台作为string时是2008-9-18,但是在公司的机子里只要在SQL文中TO_DATE一下就没问题啊 那就是某个机器日期格式设置的问题了。我更习惯于用to_char转换,然后统一用char做比较。另外,我们公司的开发规定,对oracle的软件开发,涉及日期时间的一律用varchar2。 我认为还是你的程序对 parameter传入的有问题,举个例子:在你自己的机器上给parameter传的可能是'2008-09-18',在客户机的机器上却是传了'20080918',这样肯定会报无效的月份错误,我是吃过这方面的亏的,是因为你和客户的机器时间区域的日期格式不一样,不要用程序的datetime.toString等之类函数来传,最好是格式化写死字符串后再传到arameter,这个在任何的机器上都不会有问题.不知道我说明白了没有? 用这种方式试试看:SQL> SELECT TO_DATE('13-JAN-2008','DD-MON-YYYY','NLS_DATE_LANGUAGE=AMERICAN') "MY_DATE" FROM DUAL;MY_DATE-----------1/13/2008SQL> 11 楼的意思是从库中读出来的时候用to_char转化成想要的形式,用的时候再用to_date转化成日期类型吗?不知道是不是这样理解,10楼说的库里日期用VARCHAR从来都没听说过 试一下: 在客户端的注册表HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0中,如无系统变量NLS_DATE_FORMAT,则“新建”->“字符串”,重命名为“NLS_DATE_FORMAT”,赋值为:“YYYY-MM-DD HH24:MI:SS”。 两个数据库之间的连接 视图更新 求数据表中最大值的SQL语句 数据库设计问题 oracle建了databaselink,发生could not resolve the connect identifer specfied "存储过程中如何做简单的动态查询"的问题 一个层次查询问题 急!! 构造sql语句 oracle9i的ODBC问题,在线等待! 如何将如下格式的时间存到Oracle的Date型字段,并原样取出?(Wed Aug 14 09:36:31 CST 2002) 为什么我的insert into 插入到数据库中试乱麻?? 高手来建视图
把不正确的数据修改正确后就可以了。
比如某个字符串为 09/18/08 20:00:00
这样你的转换就不对了
用户那边下班了,没来的及试,不知道行不行
为什么不用date型呢?date型也就7个字节,varchar保存日期肯定超过7个字节的,而且容易格式错误
ps:说白了还是代码写的有问题,没有对parameter参数进行固定的格式转换。
那就是某个机器日期格式设置的问题了。我更习惯于用to_char转换,然后统一用char做比较。
另外,我们公司的开发规定,对oracle的软件开发,涉及日期时间的一律用varchar2。
SQL> SELECT TO_DATE('13-JAN-2008','DD-MON-YYYY','NLS_DATE_LANGUAGE=AMERICAN') "MY_DATE" FROM DUAL;MY_DATE
-----------
1/13/2008SQL>