Oracle插入时间戳 - AM / A.M.或PM / P.M。需要

时间:2013-12-20 09:48:07

标签: oracle sqlplus date-formatting

在SQL Developer中,我创建了一个导出的.sql文件,(一个非常大的文件)。它包含数百个插入内容,如:

"Insert into SCHEMA.TABLE (
 ... ,
 CREATEDATE,
 MODIFIEDDATE,
 ....
) 
values (
 ... , 
 to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF AM'),
 to_timestamp('20-AUG-12 01.09.53.271000000 PM','DD-MON-RR HH.MI.SS.FF PM'),
 ...
);"

当我在SQL Developer中运行它时,它运行正常。但我无法用SQL Developer导入一些.sql文件(或者我不知道该怎么做)。

当我使用SQL * Plus运行它时出现以下错误:

  

ORA-01855:AM / A.M.或PM / P.M。需要

当我从插入中删除AM / PM关键字时,SQL * Plus可以插入行,但没有运气。 AM / PM有什么问题?

这是确切的插入命令:

Insert into SCHEMA.TABLE(

ENTRYID,GROUPID,COMPANYID,USERID,USERNAME,CREATEDATE,MODIFIEDDATE,
CLASSNAMEID,CLASSPK,CLASSUUID,VISIBLE,STARTDATE,ENDDATE,PUBLISHDATE,
EXPIRATIONDATE,MIMETYPE,TITLE,DESCRIPTION,SUMMARY,URL,HEIGHT,WIDTH,
PRIORITY,VIEWCOUNT

) values (

11902,11005,10136,10178,'Test Test',
to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF AM'),
to_timestamp('20-AUG-12 01.09.53.271000000 PM','DD-MON-RR HH.MI.SS.FF PM'),
10076,11900,'AAA',1,null,null,null,null,null,
'ABC','XyZ',null,null,0,0,0,2563

);

3 个答案:

答案 0 :(得分:8)

我能看到重现这一点的唯一直接方法是改变NLS的设置;但不是NLS_LANGUAGE,因为这也会影响错误消息。如你所料,使用英语是可以的:

SQL> alter session set NLS_DATE_LANGUAGE='ENGLISH';

Session altered.

SQL> select value from nls_session_parameters
  2  where parameter = 'NLS_DATE_LANGUAGE';

VALUE
--------------------------------------------------------------------------------
ENGLISH

SQL> insert into t42 (createddate)
  2  values (to_timestamp('20-08-12 01.09.53.271000000 AM','DD-MM-RR HH.MI.SS.FF PM'));

1 row created.

仅更改NLS_DATE_LANGUAGE再现错误:

alter session set NLS_DATE_LANGUAGE='SLOVAK';

Session altered.

SQL> insert into t42 (createddate)
  2  values (to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF PM'));
values (to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF PM'))
                     *
ERROR at line 2:
ORA-01855: AM/A.M. or PM/P.M. required

直接或通过影响它的内容更改NLS_LANGUAGE会使错误消息显示不同:

SQL> alter session set NLS_LANGUAGE = 'SLOVAK';

Relácia zmenená.

SQL> insert into t42 (createddate)
  2  values (to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF PM'));
values (to_timestamp('20-AUG-12 01.09.53.271000000 AM','DD-MON-RR HH.MI.SS.FF PM'))
                     *
ERROR v riadku 2:
ORA-01855: vy¿aduje sa AM/A.M. alebo PM/P.M.

您需要的语言仍然可以将AUG视为有效月份,但不会使用AM / PM;斯洛伐克似乎符合这个条款,所以我猜这可能是你来自哪里。其他语言也可以这样做。奇怪的是,NLS_LANGUAGE仍然设置时的错误消息显示AM / PM,但是to_char(sysdate, 'HH AM')表示消息错误。只有NLS_DATE_LANGUAGE设置消息仍为英文(例如,尝试使用土耳其语,但您必须更改月份名称或切换使用月份数字),它始终显示AM / PM。

如果发生了这种情况,请在运行此脚本之前将NLS_DATE_LANGUAGE更改为英语;或者在执行导出之前更改您的SQL Developer设置以使用斯洛伐克(或任何您实际使用的设置) - 这有望使导出使用DOPOLUDNIE / POPOLUDNIE,但如果它不会让我感到惊讶没有;或者更改SQL Developer NLS_TIMESTAMP_FORMAT以使用24小时时间(以及4位数年份和月份数字而不是名称)进行导出,这样可以完全避免此问题。或者从SQL Developer运行脚本。

答案 1 :(得分:1)

亚历克斯的回答很好地描述了这个问题;但是,如果您能够稍微更改生成的insert语句,则有一个更简单的解决方案。 TO_TIMESTAMP()有第三个参数,可让您在插入本身中指定NLS_DATE_LANGUAGE。

create table a ( tstamp timestamp );

Table created.

insert into a
values (to_timestamp( '20-08-12 01.09.53.271000000 AM'
                    , 'DD-MM-RR HH.MI.SS.FF PM'
                    , 'nls_date_language = ENGLISH'));

1 row created.

select *
  from a;

TSTAMP
------------------------------------------------------
20-AUG-12 01.09.53.271000

您不需要更改会话的日期语言,也不需要在之后将其更改。

答案 2 :(得分:0)

没有任何数据可供查看我无法确定但听起来像你的“大SQL文件”并不总是(或有时)以您期望的格式使用{{1}的时间戳}或AM

尝试使用24小时制而非PMAM,看看它是否与“大SQL文件”中的数据匹配:

PM