ORACLE CONVERT DATE到VARCHAR2返回错误的日期

时间:2015-03-19 15:45:12

标签: oracle date to-char sysdate

我遇到了将日期转换为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

2 个答案:

答案 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
相关问题