Oracle 插入时间戳 - AM/A.M.或下午/下午必需的

标签 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. or PM/P.M. required



当我从插入中删除 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

);

最佳答案

我可以看到重现此问题的唯一直接方法是更改​​ 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 运行脚本。

关于Oracle 插入时间戳 - AM/A.M.或下午/下午必需的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20700694/

相关文章:

Docker 上的 Oracle::ORA-12162: TNS:net 服务名称指定不正确

excel - 单元格显示日期但不显示时间

javascript - 谷歌应用程序脚本日期格式

Java : Convert string to Date

oracle - 选择 rowid Oracle

java - Liquibase 找不到 Oracle 的 ChangeLogHistoryService

java - 使用 IN 和 OUT 参数扩展 Spring StoredProcedure

oracle select into variable 当 select 什么都不返回时?

database - 连接到 SQL Server,出现错误 2013 (HY000) 失去连接

oracle - dbms_output 大小缓冲区溢出