问题现象
在日常练习中,通过客户端执行如下SQL报错:ORA-01843: 无效的月份
SELECT to_date('07-DEC-2022','DD-MON-YYYY') FROM dual;
执行后报错信息如下:
SQL 错误 [1843] [22008]: ORA-01843: 无效的月份
Error : 1843, Position : 15, Sql = SELECT to_date(‘07-DEC-2022’,‘DD-MON-YYYY’) FROM dual, OriginalSql = SELECT to_date(‘07-DEC-2022’,‘DD-MON-YYYY’) FROM dual, Error Msg = ORA-01843: 无效的月份
ORA-01843: 无效的月份
感觉被打了一闷棍,之前也这么执行过没问题的,但是现在数据库没变,SQL没变,突然就开始报错了。
问题分析
因为数据库和SQL都没有变化,所以判断不应该是SQL的语法有问题,将同样的SQL放到SQLPLUS中,发现竟然能执行成功:
SQL> SELECT to_date('07-DEC-2022','DD-MON-YYYY') FROM dual;
TO_DATE('
---------
07-DEC-22
问题解决:
解决方法其实很简单,将DD-MON-YYYY换成DD-MM-YYYY就可以了,而原因就更简单了,跟客户端执行程序有关系,我用PL/SQL执行就没问题,用SQL*PLUS执行也没问题,用DBEVER执行就报错,如果再刨根问底,其实可以定位到是跟客户端程序的驱动属性设置有关系。