3

我得到了这个例外:

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

源自此代码:

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

rs一个在哪里ResultSet

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

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

4

5 回答 5

11

我喜欢@a_horse_with_no_name的答案,但是如果您无法控制连接,则可以更改查询以返回 a 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)。您必须对所有其他查询进行回归测试才能确定。

于 2012-11-29T20:08:50.297 回答
10

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

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

于 2012-11-29T20:06:11.500 回答
0

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

于 2012-11-29T20:10:17.760 回答
0

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

日期设置

于 2019-03-18T07:13:14.477 回答
0
  1. 使用“simpleDateFormat.parse(yourValue)”将此字符串结果转换为日期
  2. 从该日期获取日或年或月值(无论您想要什么)
  3. 这将返回 int 值
  4. 检查是否为0
  5. 如果它是零设置日期等于空。
于 2019-03-18T07:21:20.190 回答