Oracle插入时间戳 - 需要AM/AM或PM/PM

 手机用户2702932821 发布于 2023-02-09 00:01

在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/AM或PM/PM

当我从插入中删除AM/PM关键字时,SQL*Plus可以插入行,与它们一起,没有运气.AM/PM有什么问题?

这是确切的insert命令:

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

);

Alex Poole.. 9

我可以看到重现这一点的唯一直接方法是改变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 个回答
  • 我可以看到重现这一点的唯一直接方法是改变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运行脚本.

    2023-02-09 00:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有