如何在jdbc MySQL查询中处理0000-00-00日期

我得到了这个例外:

java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date 

源自此代码:

 Date internalDate = rs.getDate(idx++); 

其中rsResultSet

所以对我来说这很好 – 我知道数据库中有零日期,我需要能够读取它们并将它们转换为我的下游数据结构中的适当(可能为空)数据。 问题是我不知道如何检索它并得到“软”错误。 我想在SQLException的try / catch中包装这一行但是理解这会破坏ResultSet的有效性。

是否可以在不抛出SQLException的情况下以其他方式读取此值?

我喜欢@a_horse_with_no_name的答案,但是如果你无法控制连接,你可以改变查询以返回null

 select ... case when my_date_col = '0000-00-00' then null else my_date_col end as my_date_col, ... 

或稍微简洁,但仅限mysql,选项:

  if(my_date_col = '0000-00-00', null, my_date_col) as my_date_col 

此外,建议您更改整个应用程序的JDBC行为,因为您可能会破坏依赖于返回此类日期的代码 – 也许他们使用rs.getString(i)代替。 您必须回归测试所有其他查询才能确定。

您需要告诉JDBC驱动程序将它们转换为NULL。 这是通过使用值convertToNull传递连接属性名称zeroDateTimeBehavior来完成的

有关更多详细信息,请参阅手册: http : //dev.mysql.com/doc/refman/4.1/en/connector-j-installing-upgrading.html

我建议使用rs.getString()并自己解析String 。 如果全部为0,则使用null Date引用。 如果没有,请创建适当的Date对象。