插入'2021-08-31T16:30:01.850'时间戳时报ORA-01843无效月份错误
问题产生原因
- Oracle执行插入操作时,会自动对字符串类型和Timestamp字段做隐式类型转换,转换规则默认使用当前会话的
NLS_TIMESTAMP_FORMAT参数配置的时间格式 - 你插入的时间字符串为ISO 8601标准格式(中间包含固定字符
T),和Oracle默认的时间格式不匹配,解析日期时无法识别正确的月份位置,因此抛出ORA-01843: not a valid month报错
解决方案
推荐使用显式时间转换函数规避隐式转换的不可靠问题,修改插入SQL如下:
INSERT INTO tbl_Account_Master (Account_ID, Verified_Date) VALUES (1, TO_TIMESTAMP('2021-08-31T16:30:01.850', 'YYYY-MM-DD"T"HH24:MI:SS.FF3'))
- 格式掩码中用双引号包裹
T,标识其为固定匹配字符,FF3对应精度为3位的毫秒数,和表字段Timestamp(3)的精度完全匹配
可选临时解决方案(仅当前会话生效,不推荐生产环境使用):
执行插入前先修改当前会话的默认时间格式配置:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS.FF3';
修改后你原来的插入SQL可以直接执行,但该配置会随着会话断开失效,依赖会话配置容易引发其他时间转换异常。
内容的提问来源于stack exchange,提问作者zzstar
相关产品推荐
相关产品推荐

