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: 即使我的日期格式正确也不是有效月份的主要内容,如果未能解决你的问题,请参考以下文章