ORA-01843: 即使我的日期格式正确也不是有效月份

Posted

技术标签:

【中文标题】ORA-01843: 即使我的日期格式正确也不是有效月份【英文标题】:ORA-01843: not a valid month even my date format is right 【发布时间】:2021-03-19 11:08:37 【问题描述】:

我尝试向我的表中插入一些数据,但它一直显示 ORA-01843: not a valid month 即使我的月份格式正确。

这是我的表结构:

create table PENCATATAN_CHECK_IN 
(
   ID_CHECK_IN          NUMBER               not null,
   NO_KTP               NUMBER(16)           not null,
   ID_KARYAWAN          NUMBER               not null,
   TANGGAL_CHECK_IN     DATE constraint nn_tgl_checkin not null,
   JAM_CHECK_IN         VARCHAR2(5) constraint uc_jamcheckin unique,   
   LAMA_MENGINAP        VARCHAR2(7)          not null,
   constraint PK_PENCATATAN_CHECK_IN primary key (ID_CHECK_IN)
);

这是我的插入查询:

insert into PENCATATAN_CHECK_IN values (5555551, 220180521, 8888881, to_date('20-Mar-2020', 'DD-Mon-YYYY'), '17.21', '3 hari');
insert into PENCATATAN_CHECK_IN values (5555552, 220180522, 8888882, to_date('21-Mar-2020', 'DD-Mon-YYYY'), '19.18', '4 hari');
insert into PENCATATAN_CHECK_IN values (5555553, 220180523, 8888883, to_date('22-Mar-2020', 'DD-Mon-YYYY'), '20.55', '3 hari');
insert into PENCATATAN_CHECK_IN values (5555554, 220180524, 8888884, to_date('23-Mar-2020', 'DD-Mon-YYYY'), '13.21', '2 hari');
insert into PENCATATAN_CHECK_IN values (5555555, 220180525, 8888885, to_date('24-Mar-2020', 'DD-Mon-YYYY'), '19.38', '5 hari');

谁能告诉我我的插入有什么问题?

【问题讨论】:

您的代码运行良好:dbfiddle.uk/… Oracle 中的日期文字写成date '2020-03-20'。使用此标准可避免日期语言问题。 【参考方案1】:

您的数据库不会说英语。所以,做吧:

SQL> alter session set nls_date_language = 'english';

Session altered.

SQL> insert into PENCATATAN_CHECK_IN values (5555551, 220180521, 8888881, to_date('20-Mar-2020', 'DD-Mon-YYYY'), '17.21', '3 hari');

1 row created.

或者,修改TO_DATE函数调用:

SQL> insert into PENCATATAN_CHECK_IN values (5555551, 220180521, 8888881, to_date('20-Mar-2020', 'DD-Mon-YYYY', 'nls_date_language = english'), '17.21', '3 hari');

1 row created.

【讨论】:

Littlefoot,你怎么知道这个错误是由于语言引起的? 这很明显,@Ankit;唯一引用 DATE 值的代码是看起来像“2020 年 3 月 20 日”的代码。由于格式掩码是正确的(DD-Mon-YYYY),它一定是语言。如果 OP 选择了不同的格式(仅限数字,例如 20-03-2020),他们将避免这样的问题。【参考方案2】:

如果您的数据库/会话设置为:

ALTER SESSION SET NLS_TERRITORY = 'Indonesia';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'MALAY';

(或您设置的任何非英语地区/语言。)

那么您的查询不起作用,因为它不知道月份Mar。您可以更改会话设置;但是,这不是一个可靠的解决方案,因为您需要记住每次要运行类似查询时都更改会话。

更好的解决方案是向TO_DATE 添加第三个参数来指定语言:

insert into PENCATATAN_CHECK_IN values (
  5555551,
  220180521,
  8888881,
  to_date('20-Mar-2020', 'DD-Mon-YYYY', 'NLS_DATE_LANGUAGE=English'),
  '17.21',
  '3 hari'
);

然后,无论您的数据库/会话期望什么语言,您的查询都将起作用,因为您已经告诉它您在查询中使用的是什么语言。

db小提琴here

【讨论】:

以上是关于ORA-01843: 即使我的日期格式正确也不是有效月份的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01843 不是有效月份 - 比较日期

ORA-01843: 无效的月份 -java 到 sql 日期转换

“ORA-01843: 不是一个有效的月份”错误

SQL 错误:ORA-01843:不是有效月份

ORA-01843: 无效的月份 - 报告

应用程序错误:ORA-19202:XML 处理中发生错误 ORA-01843:不是有效月份 - Oracle Apex