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

Java 如何在jdbc MySQL查询中处理0000-00-00日期,java,mysql,sql,date,jdbc,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++); 其中,rs是一个ResultSet 所以这对我来说很好-我知道数据库中有零日期,我需要能够读取这些数据并将它们转换为下游数据结构中适当的(可能为空)数据。问题是我不知道如何检索它并得到一个“软”错误。我曾考虑将这一行包装成

我得到一个例外:

java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
源自此代码:

Date internalDate = rs.getDate(idx++);
其中,
rs
是一个
ResultSet

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


是否可以以另一种方式读取此值而不引发SQLException?

您需要告诉JDBC驱动程序将其转换为NULL。这是通过将连接属性名
zeroDateTimeBehavior
与值
convertToNull

有关更多详细信息,请参阅手册:

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

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

将列设置为Allow Null,并将默认值设置为column:1900-01-01是我的最佳解决方案

  • 使用“SimpleDataFormat.parse(yourValue)”将此字符串结果转换为日期
  • 从该日期获取日、年或月值(以您想要的为准)
  • 这将返回int值
  • 检查是否为0
  • 如果为零,则将日期设置为null

  • 我记不起我的头顶了,但是你不能使用
    rs.getString()
    首先,检查是否有“0000-00-00”,然后执行
    getDate()
    ?为什么不直接在数据库中更新这些值呢。毕竟,
    0000-00-00
    不是一个有效的日期,不应该首先存储。@a_horse_和_no_名称-基本上是的,我想这样做,但这是一个庞大的表,我们无法轻松修改。所以我会选择你或波西米亚人推荐的补丁。好主意。我可能会将数据库中所有那些无效的日期值更新为NULL!没有酸葡萄,但这里有一个警告:建议您小心更改整个应用程序的JDBC行为,因为您可能会破坏依赖于这些返回日期的代码-可能它们使用
    rs.getString(i)
    。您必须对所有其他查询进行回归测试才能确定。@Bohemian:如果JDBC驱动程序抛出异常,应用程序如何依赖返回的日期?谁说了日期?其他行集处理只能对列使用
    getString()
    。只有在调用
    getDate()
    时才会引发异常,因此如果从未调用过,谁知道更改驱动程序会产生什么影响。为了记录在案,如果可能的话,我会先采用你的方法,修复任何损坏的东西(可能什么都没有)。@Bohemian:如果应用程序在
    日期
    列上使用
    getString()
    ,它无论如何都会损坏;)