当前位置: 首页 > 知识库问答 >
问题:

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

何睿范
2023-03-14

我得到了这个例外:

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?

共有3个答案

曾晨
2023-03-14

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

鲁辉
2023-03-14

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

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

闻慎之
2023-03-14

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

 类似资料:
  • 我正在使用AWS glue读取AWS Aurora DB(MySQL)表并写入S3文件。MySQL表具有日期列值'0000-00-00',这在MySQL中是允许的。由于这个原因,我的胶水工作(PySpark)失败了。如何在胶水代码中处理这个? 下面的错误信息

  • 我想在MySQL中允许零日期。我已将更改为。 我已经在中更改了它。 然而,当我尝试插入数据时,我得到了错误, 数据截断:不正确的datetime值:“0000-00-00 00:00:00” MySQL版本为5.7.18。 这方面的任何想法都将大有帮助。

  • 问题内容: 我最近接手了一个十年前创建的旧项目。它使用MySQL 5.1。 除其他外,我需要将默认字符集从latin1更改为utf8。 例如,我有这样的表: 我设置了自己的Mac来进行此工作。不用考虑太多,我运行了“ brew install mysql”,它安装了MySQL 5.7。所以我有一些版本冲突。 我下载了此数据库的副本并将其导入。 如果我尝试运行这样的查询: 我收到此错误: 我以为可以

  • 问题内容: 我需要在数据库上更改一些值。 我忘记为表格设置可空值,并且默认情况下将其设置为0000-00-00 00:00:00。 现在,我需要将该值转换为。 字段类型为“日期时间”。 我该怎么做? 我尝试使用典型的方法,但是它不起作用。 问题答案: 您首先需要将该列设置为可空: 然后更新值:

  • 问题内容: 这是一个测试代码: 提供: 但这不是一个有效的日期。我不了解返回的值,尤其是月份……您能解释一下吗? 问题答案: 您在这里看到两种效果。第一个是您使用一种可以以多种形式书写的日期书写方式: 因此,根据日期本身,您已经指定了11月30日-1。 现在剩下的时间偏移大约为9分21秒。这是因为与1911年3月10日当地时间发生的巴黎/法国UTC相比,时钟发生了变化。 我稍微修改了您的代码示例,

  • 问题内容: 如何将字段的默认值设置为“ 0000-00-00 00:00:00”?如果我们不能使用“ 0000-00-00 00:00:00”作为默认值?什么是 基本 有效tiemdate? 例如,这是用于创建我的商品表的SQL, 运行此查询时出现此错误, 问题答案: 错误原因:SQL模式 您可以设置的默认值,或场特殊的“零”作为虚拟日期“0000-00-00”值,如果SQL模式允许它。对于低于5