ORACLE将日期转换为VARCHAR2返回错误的日期
我在将日期转换为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
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版-生产