ORACLE将日期转换为VARCHAR2返回错误的日期

ORACLE将日期转换为VARCHAR2返回错误的日期,oracle,date,to-char,sysdate,Oracle,Date,To Char,Sysdate,我在将日期转换为varchar2类型时遇到问题,如以下示例所示: TABLE TEST Name Type Nullable Default Comments ----- ------------- -------- ------- -------- DESCR VARCHAR2(100) Y DATA DATE Y DATA2 VARCHAR2(50

我在将日期转换为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时,将字符转换为varchar2字段的日期为28/12/1393。

在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        
您能否运行相同的测试用例并确认select确实返回错误

另外,您的Oracle db版本是什么,Oracle客户端版本是什么


埃塔:突然的想法。。。您的表上没有更新varchar2列中日期的触发器,是吗?

我将其作为作业运行,因此我对您的脚本做了一些更改:

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

如果alter会话不是动态的,为什么要使用executeimmediate?只是为了确保日期格式与我转换时使用的格式相同。即使没有execute命令,或者如果我只是使用to_charsysdate,日期也返回错误。此块在一个作业中运行我的意思是,您不需要立即执行部分,您可以直接调用alter session。如果您直接执行SELECT,会发生什么情况?从dual中选择SYSDATE,以_CHARSYSDATE,'DD/MM/YYYY HH:MI:SS AM'@彼得朗:回报是正确的。只有在插入到varchar2变量或varchar2列中时才会发生错误,如果不将其作为作业运行会怎么样?嗯,我刚刚运行了脚本,它将正确的值插入了data2列。很奇怪。我看不出你怎么会得到不正确的值。也许是时候提出一个支持的SR了?也许。这个错误只发生在我检查过的1分贝内,没有一个有这个错误,而且它们都是同一个版本。这个表中没有触发器。如果我不是作为作业运行,它将返回正确的日期。Oracle Database 11g Enterprise Edition 11.2.0.1.0-64位生产PL/SQL 11.2.0.1.0-生产核心11.2.0.1.0用于64位Windows的生产TNS:11.2.0.1.0版-生产NLSRTL 11.2.0.1.0版-生产