Oracle中表中导入数据库报GDK-05043: 无效的月份

2026年9月3日 作者 XiaofeiHuangfu

适用范围
Oracle Database 11g及以上版本
问题概述
创建一张表导入ASH数据进行分析,将csv格式的数据使用SQL Devloper导入和insert into语句插入均报GDK-05043: 无效的月份
问题原因
表中日期字段格式不匹配。
解决方案
对日期字段使用函数TO_TIMESTAMP进行转换。
1、使用数字的日期格式
TO_TIMESTAMP(
‘2026-09-01 06:10:15.003’,
‘YYYY-MM-DD HH24:MI:SS.FF3’
)
2、使用带有英文的日期
TO_TIMESTAMP(
’01-SEP-2026 06.10.15.003 AM’,
‘DD-MON-YYYY HH.MI.SS.FF3 AM’,
‘NLS_DATE_LANGUAGE=AMERICAN’
)
说明:
HH 是12小时制,需要集合 AM/PM一起使用;
HH24 是24小时制,不能加 AM/PM;
FF3 表示3位小数秒;
以下是处理过程:
1、创建表

CREATE TABLE "HFXF"."ASH20260901" 
   (	
    "INST_ID" NUMBER, 
	"SAMPLE_TIME" TIMESTAMP (3), 
	"SQL_ID" VARCHAR2(13 BYTE), 
	"EVENT" VARCHAR2(64 BYTE), 
	"P1" NUMBER, 
	"P2" NUMBER, 
	"P3" NUMBER, 
	"CURRENT_OBJ#" NUMBER, 
	"CURRENT_FILE#" NUMBER, 
	"CURRENT_BLOCK#" NUMBER
   );

2、使用SQL Devloper导入数据
在创建的ASH20260901表上右键 “导入数据”安导入数据向导进行操作,界面报SAMPLE_TIME GDK-05043: 无效的月份
3、使用insert into语句导入

...   
INSERT INTO ASH20260901 (INST_ID, SAMPLE_TIME, SQL_ID, EVENT, P1, P2, P3, CURRENT_OBJ#, CURRENT_FILE#, CURRENT_BLOCK#) VALUES (1,to_timestamp('01-SEP-2606.10.15.003AM'),'8mhve4uy7eds','enq:TX-allocateITLentry',1415053316,786465,124164,565727,139,2542913);
--未能对行  2  执行插入
--SAMPLE_TIME GDK-05043: 无效的月份
--行 2
INSERT INTO ASH20260901 (INST_ID, SAMPLE_TIME, SQL_ID, EVENT, P1, P2, P3, CURRENT_OBJ#, CURRENT_FILE#, CURRENT_BLOCK#) VALUES (1,to_timestamp('01-SEP-2606.10.14.002AM'),'8mhve4uy7eds','enq:TX-allocateITLentry',1415053316,786465,124164,565726,126,2606529);
--未能对行  3  执行插入
--SAMPLE_TIME GDK-05043: 无效的月份
--行 3
INSERT INTO ASH20260901 (INST_ID, SAMPLE_TIME, SQL_ID, EVENT, P1, P2, P3, CURRENT_OBJ#, CURRENT_FILE#, CURRENT_BLOCK#) VALUES (1,to_timestamp('01-SEP-2606.10.14.002AM'),'8mhve4uy7eds','enq:TX-allocateITLentry',1415053316,786465,124164,565728,108,2571649);
--未能对行  4  执行插入
--SAMPLE_TIME GDK-05043: 无效的月份
--行 4
INSERT INTO ASH20260901 (INST_ID, SAMPLE_TIME, SQL_ID, EVENT, P1, P2, P3, CURRENT_OBJ#, CURRENT_FILE#, CURRENT_BLOCK#) VALUES (1,to_timestamp('01-SEP-2606.10.14.002AM'),'8mhve4uy7eds','enq:TX-allocateITLentry',1415053316,786465,124164,565727,139,2542913);
--未能对行  5  执行插入   
...

使用insert into 语句仍然报SAMPLE_TIME GDK-05043: 无效的月份。

4、检查日期格式参数

SQL>select value from nls_session_parameters where parameter='NLS_DATE_FORMAT';
VALUE
--------------------------------------------------------------------------------
DD-MON-RR

NLS_DATE_FORMAT参数是 DD-MON-RR格式,导入数据的格式与该格式不匹配。
5、通过TO_TIMESTAMP函数转换

INSERT INTO ASH20260824 (INST_ID, SAMPLE_TIME, SQL_ID, EVENT, P1, P2, P3, CURRENT_OBJ#, CURRENT_FILE#, CURRENT_BLOCK#) VALUES (1,TO_TIMESTAMP('24-AUG-26 06.10.14.002 AM', 'DD-MON-RR HH.MI.SS.FF AM','NLS_DATE_LANGUAGE = AMERICAN'),'8mhve4uy7eds','enq: TX - allocate ITL entry', 1415053316, 196613 ,  1638443 ,565731 , 94 ,2682239);

通过TO_TIMESTAMP函数对SAMPLE_TIME字段数据库进行了转换后,sqlplus命令行可以成功导入。

【小结】向数据库中导入含有日期格式的csv格式数据,可以采用“纯数字日期+显式格式”使用TO_TIMESTAMP函数进行转换,不依赖客户端和数据库会话的默认日期格式。
-the end-

笔者文章集合详见:
https://www.myhfxf.com
https://www.xiaofeihuangfu.com
CSDN:https://blog.csdn.net/xfhuangfu
ITPUB:https://blog.itpub.net/28373936/
微信公众号:xfhuangfu