在JDBC中处理日期时间值0000-00-00:00:00

如果我尝试这样做,我会遇到一个异常(见下文)

resultset.getString(“添加日期”);

对于包含日期时间值0000-00-00 00:00:00(DATETIME的准空值)的MySQL数据库的JDBC连接,即使我只是尝试将该值获取为字符串,而不是对象

我是通过做这些来逃避的

选择CAST(将日期添加为字符)作为添加日期

这很有效,但看起来很傻。。。有更好的方法吗

我的观点是,我只需要原始的DATETIME字符串,这样我就可以自己解析它了

注意:这里是0000的来源:http://dev.mysql.com/doc/refman/5.0/en/datetime.html)

非法的日期时间、日期或时间戳
值被转换为“零”
适当类型的值
(’0000-00-00:00:00’或
“0000-00-00”)

具体的例外情况如下:

SQLException:无法将值“0000-00-00:00:00”从第5列转换为时间戳。
SQLState:S1009
供应商错误:0
java.sql.SQLException:无法将值“0000-00-00 00:00:00”从第5列转换为时间戳。
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
位于com.mysql.jdbc.ResultSetImpl.getTimestampFromString(ResultSetImpl.java:6343)
位于com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5670)
位于com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5491)
位于com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5531)

备选答案是,您可以在数据源配置中直接使用此JDBC URL:

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull

编辑:

来源:MySQL手册

所有零组件(0000-00-00…)的日期时间-这些值在Java中无法可靠表示。连接器/J 3.0.x在从结果集读取时总是将其转换为NULL

默认情况下,当遇到这些值时,Connector/J 3.1会引发异常,因为根据JDBC和SQL标准,这是最正确的行为。可以使用zeroDateTimeBehavior配置属性修改此行为。允许值为:

  • 异常(默认值),它抛出一个SQLState为S1009的SQLException
  • convertToNull,返回NULL而不是日期
  • 舍入,将日期舍入到最接近的值0001-01-01

更新:Alexander报告了一个影响mysql-connector-5.1.15功能的bug。请参见官方网站上的变更日志

发表评论