在使用 Mysql 中有时候会遇到 datetime 字段抛出Cause: java.sql.SQLException: Value 0000-00-00 00:00:00 can not be represented as java.sql.Timestamp 异常,这是因为Java和MySQL在时间处理上不同造成的,请看本文的解决思路。
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 表示不了,所以就抛出了这个异常。
那么知道这个异常产生的原因后,该如何解决呢?
根据 stackoverflow 上一部分人的回答,可以使用下面的方式连接数据库来解决:
jdbc:mysql://www.xttblog.com:3306/xttblog?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 属性即可。