一、问题

一大早到公司 Mysql 中的一个 datetime 字段时碰到了一个
Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp 异常
之前使用都没有问题,本地也是没有问题。今天要部署上线就是不行。
通过最终的搜索排查,我把整个过程分享给大家!
java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestampat com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.mysql.jdbc.ResultSetRow.getTimestampFast(ResultSetRow.java:937) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.mysql.jdbc.ByteArrayRow.getTimestampFast(ByteArrayRow.java:130) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.mysql.jdbc.ResultSetImpl.getTimestampInternal(ResultSetImpl.java:5921) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.mysql.jdbc.ResultSetImpl.getTimestamp(ResultSetImpl.java:5591) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.mysql.jdbc.ResultSetImpl.getTimestamp(ResultSetImpl.java:5620) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]at com.zaxxer.hikari.pool.HikariProxyResultSet.getTimestamp(HikariProxyResultSet.java) ~[HikariCP-2.7.9.jar!/:na]at org.hibernate.type.descriptor.sql.TimestampTypeDescriptor$2.doExtract(TimestampTypeDescriptor.java:84) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:333) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2868) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1747) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1673) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.getRow(Loader.java:1562) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:732) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.processResultSet(Loader.java:991) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.doQuery(Loader.java:949) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.doList(Loader.java:2692) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.doList(Loader.java:2675) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.Loader.list(Loader.java:2502) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1490) ~[hibernate-core-5.2.17.Final.jar!/:5.2.17.Final]at ...省略

二、解决

根据异常信息,我翻译了一下,大概意思是说,‘0000-00-00 00:00:00’ 这个时间不能用 Java 来表示。虽然数据库中可以存放这个值,但是 Java 中的时间都是从 1970 年开始的。格林威治时间 1970年01月01日00时00分00秒(UTC+8北京时间1970年01月01日08时00分00秒),所以你这个 ‘0000-00-00 00:00:00’ 的时间,Java 表示不了,所以就抛出了这个异常。

  1. 数据连接处理
  • 那么知道这个异常产生的原因后,该如何解决呢?

  • jdbc:mysql://www.teddylife.com:3306/test?zeroDateTimeBehavior=convertToNull

  • MySQL 的官方资料对 zeroDateTimeBehavior 属性做出了详细的解释

设置 zeroDateTimeBehavior 属性,当遇到 DATETIME 值完全由 0 组成时,最终的有效值可以设置为,异常(exception),一个近似值(round),或将这个值转换为 null(convertToNull)。默认情况为 exception,设置这个属性会抛出一个 SQLException 异常,也就是文章开头所说到的异常。其 SQLSate 码为 S1009。这个状态码在写存储过程处理异常时也可以用到。convertToNull,返回 null 来替代 0000-00-00 这样的日期。round,将日期转换为 0001-01-01。因此,出现 0000-00-00 属于一个无效日期,用 convertToNull 属性即可。
  1. Java 中日期
  • 能表示日期的提供了 4 个类,分别是:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp。
    它们的继承关系如下
java.lang.Object
....|__java.util.Date
..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time
....|__java.security.Timestamp* java.util.Date 日期格式为:年月日时分秒
* java.sql.Date 日期格式为:年月日[只存储日期数据不存储时间数据]
* java.sql.Time 日期格式为:时分秒
* java.sql.Timestamp 日期格式为:年月日时分秒纳秒(毫微秒)

java.util.Date 这个类是 java.sql.Date, java.sql.Time, java.slq.Timestamp 这三个类的父类。这三个类对 java.util.Date 类进行了包装。

java.sql.Date 类屏蔽了 java.util.Date 类的时间有关的方法(形如:hh:mm:ss),因此,不可以通过这个类访问时间有关的信息,比如,如果你通过 sqlDate.getHour() 方法去访问小时信息,此方法会抛出一个IllegalArgumentException异常。这是因为 java.sql.Date 在继承 java.util.Date 类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。

Java.sql.Time 类屏蔽了 java.util.Date 的日期有关的字段(形如:yyyy-MM-dd),因此,不能通过这个类访问日期有关的信息,比如:如果你通过 sqlTime.getYear() 方法去获取年有关的信息,此方法会抛出一个 IllegalArgumentException 异常。这是因为 java.sql.Time 在继承 java.util.Date 类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的 Time 数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。

Java.sql.Timestamp 字段则对 java.util.Date 这个类进行了扩充,它在 java.util.Date 类的基础上增加了毫秒的时间访问控制,因此,你可以通过 getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1秒等于十亿毫微秒),同样的,这也是为了和数据库中的Timestamp数据类型进行匹配。

  • 理清了上述四个类的关系,那么 java.util.Date 和 java.util.Calendar 类有什么关系呢?

Java.util.Calendar 类是 java.util.Date 类的一个更加深入,更加全面的替代。Java.util.Calendar 类支持 java.util.Date 的所有功能,此外,Calendar 还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar 还增加了比 Date 更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。

java.util.Calendar 区别与 java.util.Date 的几个地方也需要注意一下:首先,Calendar 增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而 java.util.Date 只是精确到秒。其次,Calendar 过去年的时候是当前年份比如:2010,而 Date 获取年份的时获取到的是当前年份-1900的一个值(2010-1900=110,因此,你调用 getYear 后过去的值就是110)。最后 Calendar 是一个抽象类,之所以能够实例化,是因为此处的 Calendar 充当了一个类似于工厂的作用,在 getInstance 方法中实例化了 Calendar 子类 GregorianCalendar,并把它返回给用户使用。

针对不同的数据库选用不同的日期类型 。例如:Oracle的Date类型,只需要年月日,选择使用java.sql.Date类型;MySQL 和 Sqlserver 数据库的 DateTime 类型,需要年月日时分秒,选择 java.sql.Timestamp 类型。

已解决:java.sql.SQLException: Value ‘0000-00-00 00:00:00‘ can not be represented as java.sql.Timestamp相关推荐

  1. 解决方法dataSource init error java.sql.SQLException: com.mysql.cj.jdbc.Driver

    使用mysql+druid时报错 这是报错信息折腾了好久. 七月 08, 2019 2:39:14 下午 com.alibaba.druid.pool.DruidDataSource error 严重 ...

  2. 解决error {dataSource-1} init error java.sql.SQLException: com.mysql.cj.jdbc.Driver

    七月 08, 2019 2:39:14 下午 com.alibaba.druid.pool.DruidDataSource error 严重:error {dataSource-1} init err ...

  3. java.sql.SQLException: Lock wait timeout exceeded --转

    org.springframework.dao.CannotAcquireLockException 的解决> 直接上 bug 的详细信息: 2012-03-12 15:20:31 XmlBea ...

  4. java.sql.SQLException: Can not issue empty query.

    1.错误叙述性说明 java.sql.SQLException: Can not issue empty query.at com.mysql.jdbc.SQLError.createSQLExcep ...

  5. java中的无效的列类型_java.sql.SQLException: 无效的列类型: 1111

    在使用Mybaits Plus更新数据时报错: 2018-09-05 10:55:40.712 DEBUG 15828 --- [nio-8110-exec-1] c.c.x.s.m.A.update ...

  6. java.sql.SQLException: Invalid utf8 character string: 'ACED00'

    使用JPA+Hibernate执行原生sql查询时报了异常,一开始以为是数据库编码的问题,尝试了几种方式都没有解决,静下来想了想,原来是查询的sql中有status in (?1),而传入的参数值是枚 ...

  7. mysql5.5异常: java.sql.SQLException: Packet for query is too large (1055975 > 1048576).

    mysql5.5异常: java.sql.SQLException: Packet for query is too large (1055975 > 1048576). mysql5.5异常: ...

  8. java sqlexception_java.sql.SQLException

    java.sql.SQLException: ResultSet is closed是什么错误 java.sql.SQLException:ResultSetisclosed是什么错误 java.sq ...

  9. 连接数据库出错:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/

    连接数据库出错 java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/ 今天在做Java we ...

  10. java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ 解决方案

    java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ 解决方案 参考文章: (1)java.sql.SQLException: ...

最新文章

  1. mysql err 1118_MySQL ERROR1118报错详解 Row size too large
  2. 1.2 UML带来了什么(学习笔记)
  3. jQuery下的ajax【5分钟掌握】
  4. python表示矩阵
  5. 如何从特定位置开始分享YouTube视频
  6. 早期访问中具有NetBeans的Oracle公共云Java服务
  7. 曾隐姓埋名28年,两弹一星元勋于敏逝世
  8. 腾讯云成为国内首家FinOps基金会顶级会员
  9. Android 系统(236)---了解 64 位版本
  10. 为啥国内程序员写的代码也用英文注释?
  11. Ubuntu 13.10 用sogou拼音替换ibus-转
  12. 读EntityFramework.DynamicFilters源码_心得_示例演示02
  13. 中缀表达式求值、后缀表达式求值、中缀转后缀、前缀
  14. 解决应用程序无法正常启动0xc0150002等问题
  15. Trilateration三边测量定位算法
  16. 象牙大钢琴II压缩版-Synthogy Ivory by JR Samples II Kontakt
  17. [Sencha ExtJS amp; Touch] 在Sencha(Extjs/Touch)应用程序中使用plugins(插件)和mixins(混入)...
  18. 人脸识别系统技术方案
  19. windows图标文件夹_如何在Windows 10中获取Windows 7的旧文件夹图标
  20. matlab p文件转码 matlab pcode文件 将matlab中的p文件转为m文件工具

热门文章

  1. Unity3D——学习分享(二) 给游戏对象添加材质和贴图
  2. 触动精灵 python_触动精灵远程Log模块
  3. 用手机版python爬虫_Python爬虫也能用手机进行抓包?没错!这个技巧我只告诉你...
  4. 谷歌身份验证器验证码不对怎么回事_暴雪战网游戏手机安全令,身份验证器的使用方法...
  5. CountDownLatch和CyclicBarrier的爱恨情仇
  6. 职称计算机考试时的输入法,2017年高级职称计算机预习:输入法的使用
  7. 【渝粤教育】国家开放大学2019年春季 97纳税筹划 参考试题
  8. 使用fsck命令检查并修复linux文件系统
  9. chainWebpack配置WebWorkers
  10. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(8)之文章管理