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,则使用nullDate
引用。如果没有,请创建一个适当的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()
,它无论如何都会损坏;)