Oracle中不同语言环境导致to_date出错的问题,oracleto_date
写了个存储过程,里面用了个函数,函数里有一段to_date(dateFrom, 'yyyy/mm/dd'),运行后发现数据插入错误,插入的数据为“0001/9/14”。感觉莫名其妙,不知道为什么会是这样的数据,经过调试,发现我在测试窗口输入的日期“2014/9/1”在程序中变成了“01-SEP-14”,瞬间恍然大悟,原来是当做01年9月14日了。
知道了原因就好说了,直接放出解决办法:to_date(to_char(dateFrom, 'yyyy/mm/dd'), 'yyyy/mm/dd')。再次运行,成功记录。
环境变量 nls_date_language 没有设置。
下面是 没有设置的时候 查询的结果:
SQL> select to_char(sysdate, 'dd-mon-yy') from dual;
TO_CHAR(SYSDAT
--------------
05-10月-11
查询设置的语句
SQL> show parameter nls_date_language;
NAME TYPE VALUE
------------------------------------ ----------- -------
nls_date_language string
修改设置的语句
SQL> alter session set nls_date_language = 'AMERICAN';
会话已更改。
修改设置以后的查询
SQL> select to_char(sysdate, 'dd-mon-yy') from dual;
TO_CHAR(SYSD
------------
05-oct-11
SQL> SELECT TO_DATE('05-oct-11', 'dd-mon-yy') from dual;
TO_DATE('05-
------------
05-OCT-11
肯定是因为某笔记录的格式不符合YYYYMMDD。
你应该写个function,找出这种异常资料,并纠正。
create function is_valid_date(p_yyyyymmdd in varchar2) return number is
l_date date;
begin
l_date = to_date(p_yyyyymmdd,'yyyymmdd');
return 1;
exception when others then
return 0;
end;
然后写select语句。
select * from pc_xx where is_valid_date(substr(rydjsj,1,8)) = 0;