在项目开发中,遇到一个问题,是在做insert
操作的时候抛出的异常:ORA-01843:
无效的月份
于是乎,去查找到底是哪里出了这个问题,问题定位:一定是表结构字段类型是日期类型或者时间戳类型的字段中出现了问题,然后进行排查。
首先声明一下,我的实体中的timestamp
和Date
类型,我都在java
中用String
来表示,那么问题来了?
经过排查和以往经验,其中关于Date
的数据库字段是不存在问题的,那么问题只可能发生在timestamp
字段的插入中。
最后发现,如果数据字段是timestamp
时间戳类型,java
中用String
来表示的话,那么在mybatis
中进行变量绑定设值的时候,需要用这种方式:
insert into t_info (id,createTime) values(#{id},to_date(#{createTime},'yyyy-MM-dd HH24:mi:ss'))
。
这个才是正确的插入timestamp
字段值得方法,数据库使用的是Oracle
。
还有另外一种ora-01843
:无效月份的原因:
就是日期格式化的问题,当时遇到这个问题是在查询条件为日期控件,然后在sql处理的时候发现的,原因是传参的值和指定的日期模式不匹配,导致的异常。
举例:select * from t_info t where t.scrq = to_date('2018-01-1','yyyyMMdd')
;
可能当时因为手误,想写yyyy-MM-dd
,实际写成了yyyyMMdd
,导致抛出ora-01843
:无效月份异常。