我遇到了将日期转换为varchar2类型的问题,如下例所示:
TABLE TEST
Name Type Nullable Default Comments
----- ------------- -------- ------- --------
DESCR VARCHAR2(100) Y
DATA DATE Y
DATA2 VARCHAR2(500) Y
execute immediate 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD/MM/YYYY HH:MI:SS AM''';
DELETE FROM TEST;
INSERT INTO TEST SELECT 'SOME TEXT', SYSDATE, TO_CHAR(SYSDATE,'DD/MM/YYYY HH:MI:SS AM') FROM DUAL;
1 SOME TEXT "19/03/2015 12:05:45" "28/12/1393 12:05:45 TARDE"
在表中插入SYSDATE将to_char转换为varchar2字段时,日期为28/12/1393
。
答案 0 :(得分:0)
以下对我来说没问题(在11.2.0.2上,使用客户端11.2.0.2):
column descr format a12
column data2 format a30
create table test (descr varchar2(100),
data date,
data2 varchar2(500));
begin
execute immediate 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD/MM/YYYY HH:MI:SS AM''';
end;
/
DELETE FROM TEST;
INSERT INTO TEST SELECT 'SOME TEXT', SYSDATE, TO_CHAR(SYSDATE,'DD/MM/YYYY HH:MI:SS AM') FROM DUAL;
commit;
select * from test;
drop table test;
选择返回:
DESCR DATA DATA2
------------ ---------------------- ------------------------------
SOME TEXT 19/03/2015 12:17:00 PM 19/03/2015 12:17:00 PM
您可以运行相同的测试用例并确认选择确实返回错误吗?
此外,您的Oracle数据库版本是什么,以及您的Oracle客户端版本是什么?
ETA:突然想到......你的桌子上没有一个触发器来更新varchar2列中的日期,是吗?
答案 1 :(得分:0)
我把它作为一份工作运行,所以我改变了你的脚本:
create table test (descr varchar2(100),
data date,
data2 varchar2(500));
create procedure testt is
begin
execute immediate 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD/MM/YYYY HH:MI:SS AM''';
DELETE FROM TEST;
INSERT INTO TEST SELECT 'SOME TEXT', SYSDATE, TO_CHAR(SYSDATE,'DD/MM/YYYY HH:MI:SS AM') FROM DUAL;
commit;
end;
/
declare
job number;
begin
DBMS_JOB.Submit(
job => JOB,
what => 'testt();',
next_date => SYSDATE
);
commit;
end;
/
SELECT * FROM TEST;
DROP TABLE TEST;
DROP PROCEDURE TESTT;
我得到了结果:
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as
SQL>
SQL> create table test (descr varchar2(100),
data date,
data2 varchar2(500));
Table created
SQL> create procedure testt is
begin
execute immediate 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD/MM/YYYY HH:MI:SS AM''';
DELETE FROM TEST;
INSERT INTO TEST SELECT 'SOME TEXT', SYSDATE, TO_CHAR(SYSDATE,'DD/MM/YYYY HH:MI:SS AM') FROM DUAL;
commit;
end;
16 /
Procedure created
SQL> declare
job number;
begin
DBMS_JOB.Submit(
job => JOB,
what => 'testt();',
next_date => SYSDATE
);
commit;
end;
/
PL/SQL procedure successfully completed
SQL> SELECT * FROM TEST;
DESCR DATA DATA2
-------------------------------------------------------------------------------- ----------- --------------------------------------------------------------------------------
SOME TEXT 19/03/2015 28/12/1393 01:47:57 TARDE