我得到这个异常:
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的阅读以另一种方式这个价值?
我喜欢@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。 这是通过一个连接属性名称进行zeroDateTimeBehavior
与价值convertToNull
欲了解更多详情,请参阅本手册: http://dev.mysql.com/doc/refman/4.1/en/connector-j-installing-upgrading.html
我建议使用rs.getString()
和解析String
自己。 如果是全部为0,然后用空Date
的参考。 如果没有,创建一个适当的Date
对象。
设置列允许空值,并设置为默认值在列:1900-01-01是我最好的解决方案...