如何处理在JDBC MySQL查询0000-00-00日期(How to process 0000-

2019-07-04 06:58发布

我得到这个异常:

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

从这个代码起源:

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

其中rs是一个ResultSet

所以这是好的,我 - 我知道在数据库中有zero'ed日期,我需要能够读取这些并将它们转换成合适的(可能是空)数据在我的下行数据结构。 问题是我不知道该如何找回它,并得到一个“软”错误。 我想过包裹在一个try / catch为SQLException这个线,但明白这将打破ResultSet中的有效性。

是否有可能不抛出SQLException的阅读以另一种方式这个价值?

Answer 1:

我喜欢@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)来代替。 你将不得不回归测试的所有其他查询是肯定的。



Answer 2:

你需要告诉JDBC驱动程序将它们转换为NULL。 这是通过一个连接属性名称进行zeroDateTimeBehavior与价值convertToNull

欲了解更多详情,请参阅本手册: http://dev.mysql.com/doc/refman/4.1/en/connector-j-installing-upgrading.html



Answer 3:

我建议使用rs.getString()和解析String自己。 如果是全部为0,然后用空Date的参考。 如果没有,创建一个适当的Date对象。



Answer 4:

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



Answer 5:

  1. 通过使用这种转换字符串结果的日期“simpleDateFormat.parse(yourValue)”
  2. 找一天或一年或一个月值自该日起(无论你想)
  3. 这将返回int值
  4. 检查是否是0
  5. 如果它是零设定的日期等于空。


文章来源: How to process 0000-00-00 date in jdbc MySQL query