153

我有一个包含日期的数据库表

 (`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 

我正在使用 MySQL。从程序中,有时数据会在没有日期的情况下传递到数据库。0000-00-00 00:00:00 因此,当使用给出错误的日期列调用表数据时,日期值会自动分配给

...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......

我试图在插入数据时将空值传递给日期,但它被分配给当前时间。

有什么方法可以在ResultSet不更改表结构的情况下获得?

4

12 回答 12

329

您可以直接在数据源配置中使用此 JDBC URL:

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull

于 2012-06-21T08:00:06.487 回答
19

“日期”“0000-00-00”是否是有效的“日期”与问题无关。“只需更改数据库”很少是可行的解决方案。

事实:

  • MySQL 允许使用零值的日期。
  • 此“功能”在其他语言中得到广泛使用。

因此,如果我“只更改数据库”,数千行 PHP 代码将会中断。

Java 程序员需要接受 MySQL 的零日期,并且当其他语言依赖此“功能”时,他们需要将零日期放回数据库中。

连接到 MySQL 的程序员需要处理 null 和 0000-00-00 以及有效日期。将 0000-00-00 更改为 null 不是一个可行的选择,因为这样您就无法再确定日期是否应为 0000-00-00 以写回数据库。

对于 0000-00-00,我建议将日期值检查为字符串,然后将其更改为 ("y",1) 或 ("yyyy-MM-dd",0001-01-01) 或任何无效MySQL 日期(小于 1000 年,iirc)。MySQL 还有另一个“特性”:低日期自动转换为 0000-00-00。

我意识到我的建议是一团糟。但是 MySQL 的日期处理也是如此。两个kludges不能让它正确。事实是,许多程序员将不得不永远处理 MySQL 零日期。

于 2013-02-14T11:29:25.433 回答
11

将以下语句附加到 JDBC-mysql 协议:

?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

例如:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
于 2014-06-06T05:03:51.823 回答
7

0000-00-00 00:00:00不要使用像or之类的假日期0001-01-01 00:00:00(后者应该被接受,因为它是有效日期),而是更改您的数据库架构以允许NULL值。

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
于 2012-06-21T07:59:01.277 回答
5

作为一个极端的转变,当您无法更改日期列或更新值时,或者当这些修改发生时,您可以使用 case/when 进行选择。

SELECT CASE ModificationDate WHEN '0000-00-00 00:00:00' THEN '1970-01-01 01:00:00' ELSE ModificationDate END AS ModificationDate FROM Project WHERE projectId=1;
于 2015-08-10T15:28:44.617 回答
1

我努力解决了这个问题,并在上​​面接受的答案中实现了@Kushan 提供的 URL 连接解决方​​案。它在我本地的 MySql 实例中工作。但是当我将我的 Play/Scala 应用程序部署到 Heroku 时,它就不再工作了。Heroku 还将几个 args 连接到他们提供给用户的 DB URL,以及这个解决方案,因为 Heroku 使用连接“?” 之前自己设置的args,是行不通的。但是我发现了一个不同的解决方案,它似乎同样有效。

SET sql_mode = 'NO_ZERO_DATE';

我把它放在我的表描述中,它解决了 '0000-00-00 00:00:00' 不能表示为 java.sql.Timestamp 的问题

于 2013-01-15T23:33:35.870 回答
1

你可以试试这样

ArrayList<String> dtlst = new ArrayList<String>();
String qry1 = "select dt_tracker from gs";

Statement prepst = conn.createStatement();
ResultSet rst = prepst.executeQuery(qry1);
while(rst.next())
{
    String dt = "";
    try
    {
        dt = rst.getDate("dt_tracker")+" "+rst.getTime("dt_tracker");
    }
    catch(Exception e)
    {
        dt = "0000-00-00 00:00:00";
    }

    dtlst.add(dt);
}
于 2017-12-20T08:18:15.240 回答
0

没有 0000 年,也没有 00 月或 00 日。我建议你试试

0001-01-01 00:00:00

虽然在某些标准中定义了第 0 年,但它比有用的恕我直言更容易令人困惑。

于 2012-06-21T07:53:18.857 回答
0

如果不需要,您可以从 mysql 表中的列中删除“not null”属性。当您删除“not null”属性时,不需要“0000-00-00 00:00:00”转换,问题就消失了。

至少对我有用。

于 2017-07-11T15:15:45.267 回答
0

我知道这将是一个迟到的答案,但这是最正确的答案。

在 MySQL 数据库中,将timestamp默认值更改为CURRENT_TIMESTAMP. 如果您有带有虚假值的旧记录,则必须手动修复它们。

于 2016-12-06T07:54:55.337 回答
0

只需将字段转换为 char

例如: cast(updatedate) as char as updatedate

于 2016-06-03T06:36:18.770 回答
-2

我相信这对于在通过logstash 错误:logstash.inputs.jdbc - 执行 JDBC 查询时出现异常 {:exception=>#}

答案:jdbc:mysql://localhost:3306/database_name?zeroDateTimeBehavior=convertToNull"

或者如果你正在使用 mysql

于 2017-03-27T06:45:04.863 回答