Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
今天在数据库中添加了一个日期型的字段,然后运行项目时抛出了一个异常Cause: java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
错误信息
Cause: java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
; SQL []; Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp; nested exception is java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:108)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:74)
at org.mybatis.spring.SqlSessionTemplate
S
q
l
S
e
s
s
i
o
n
I
n
t
e
r
c
e
p
t
o
r
.
i
n
v
o
k
e
(
S
q
l
S
e
s
s
i
o
n
T
e
m
p
l
a
t
e
.
j
a
v
a
:
399
)
a
t
c
o
m
.
s
u
n
.
p
r
o
x
y
.
SqlSessionInterceptor.invoke(SqlSessionTemplate.java:399) at com.sun.proxy.
SqlSessionInterceptor.invoke(SqlSessionTemplate.java:399)atcom.sun.proxy.Proxy28.selectList(Unknown Source)
解决方案
当MySQL中date或datetime类型的列有全0值时会出现此错误,例如0000-00-00 00:00:00,在我添加了这个日期类型的字段后,MySQL默认赋值0000-00-00 00:00:00,所以导致了异常的抛出
经过我和某度的努力,得到如下结果:
MySQL Connector/J 3.0.x (3.0各版本)会把为0的date或者datetime类型转换为null值,但是在MySQL Connector/J 3.1 及以后的版本中就不是这样了,.默认会抛出这么一条异常"java.sql.SQLException: Value ‘0000-00-00’ can not be represented as java.sql.Date"
MySQL认为‘0000-00-00 00:00:00’是一个有效的日期,但是Java.sql.Date并不这么认为,它不能正确地表示出这个日期
1、使用case when语句,将查找出的0日期转换为null,比如这样:
SELECT
CASE WHEN date!=‘0000-00-00’ THEN date END new_date
FROM
yourtable
2、在连接字符串中加上zeroDateTimeBehavior=convertToNull实现自动转换
3、去数据库手动更改值为‘0000-00-00 00:00:00’的记录