【问题标题】:How to process 0000-00-00 date in jdbc MySQL query如何在 jdbc MySQL 查询中处理 0000-00-00 日期
【发布时间】:2012-11-17 23:55:18
【问题描述】:

我遇到了这个异常:

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

【问题讨论】:

  • 我不记得我的头顶了,但你不能先使用rs.getString(),检查是否为'0000-00-00',然后使用getDate()?跨度>
  • 为什么不直接更新数据库中的值。毕竟0000-00-00 不是一个有效的日期,一开始就不应该被存储。
  • @a_horse_with_no_name - 基本上是的,我想这样做,但这是一个我们无法轻松修改的巨大表。所以我会选择你或 Bohemian 建议的补丁之一。

标签: java mysql sql date jdbc


【解决方案1】:

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

更多详情见手册:http://dev.mysql.com/doc/refman/4.1/en/connector-j-installing-upgrading.html

【讨论】:

  • +!没有酸葡萄,但这里有一个警告:建议谨慎更改整个应用程序的 JDBC 行为,因为您可能会破坏依赖于返回此类日期的代码 - 也许他们使用 rs.getString(i) 代替。您必须对所有其他查询进行回归测试才能确定。
  • @Bohemian:如果 JDBC 驱动程序抛出异常,应用程序如何依赖返回的日期?
  • 谁说过日期?其他行集处理只能在列上使用getString()。只有在调用getDate() 时才会抛出异常,因此如果从未调用过,谁知道更改驱动程序会产生什么影响。只是为了记录,如果可能的话,我会先做你的方法并修复任何损坏的东西(可能什么都没有)。
  • @Bohemian:如果应用程序在DATE 列上使用getString(),它无论如何都会损坏;)
【解决方案2】:

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

【讨论】:

  • 好主意。我可能会在数据库中将所有这些无效的 DATE 值更新为 NULL。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:
      1. 使用“simpleDateFormat.parse(yourValue)”将此字符串结果转换为日期
      2. 从该日期获取日或年或月值(无论您想要什么)
      3. 这将返回 int 值
      4. 检查是否为0
      5. 如果是零设置日期等于null。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-09
        • 2015-07-19
        • 2018-07-31
        • 2017-09-21
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 2017-10-03
        相关资源
        最近更新 更多