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

时间:2012-11-29 20:02:04

标签: java mysql sql date jdbc

我遇到了这个例外:

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的情况下以其他方式读取此值?

5 个答案:

答案 0 :(得分:10)

您需要告诉JDBC驱动程序将它们转换为NULL。这是通过传递值为zeroDateTimeBehavior

的连接属性名convertToNull来完成的

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

答案 1 :(得分:9)

我喜欢@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)代替。你必须回归测试所有其他查询才能确定。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

设置列允许为空,并在列1900-01-01处设置默认值是我的最佳解决方案...

Date Setting

答案 4 :(得分:0)

  1. 使用“ simpleDateFormat.parse(yourValue)”将此字符串结果转换为日期
  2. 从该日期获取日期,年份或月份的值(任意值)
  3. 这将返回int值
  4. 检查它是否为0
  5. 如果为零,则将日期设置为空。