'0000-00-00 00:00:00'不能表示为java.sql.Timestamp错误

我有一个包含date的数据库表

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

我正在使用MySQL。 从程序中有时数据没有date传递到数据库。 所以,当date值被自动赋值为0000-00-00 00:00:00时,表格数据被调用时会给出错误的date列

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

我试图将空值传递给插入数据的date,但是它被赋值到当前时间。

有什么办法可以在不改变表结构的情况下得到ResultSet

提前致谢

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

JDBC:MySQL的:// yourserver:3306 / yourdatabase zeroDateTimeBehavior = convertToNull

“date”“0000-00-00”是否是一个有效的“date”与问题无关,“只要更改数据库”很less是一个可行的解决scheme。

事实:

  • MySQL允许一个值为零的date。
  • 这个“function”与其他语言广泛使用。

所以,如果我“只是改变数据库”,数以千计的PHP代码行将打破。

Java程序员需要接受MySQL零date,当其他语言依赖于这个“特性”时他们需要将零date放回到数据库中。

连接到MySQL的程序员需要处理null和0000-00-00以及有效的date。 将0000-00-00更改为空不是一个可行的选项,因为那么您不能再确定date是否预期为写回到数据库的0000-00-00。

对于0000-00-00,我build议将date值检查为一个string,然后将其更改为(“y”,1)或(“yyyy-MM-dd”,0001-01-01),或者将其更改为任何无效MySQLdate(不到1000年,iirc)。 MySQL有另一个“function”:低date自动转换为0000-00-00。

我意识到我的build议是一个kludge。 但MySQL的date处理也是如此。 而且有两件事情是不对的。 事实是,许多程序员将不得不永远处理MySQL零date。

而不是使用假date,如0000-00-00 00:00:000001-01-01 00:00:00 (后者应被接受,因为它是一个有效的date),更改您的数据库架构,以允许NULL值。

 ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL 

将以下语句附加到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 

作为一名学员,如果不能更改date列或更新值,或者在进行这些修改时,可以使用case / when进行select。

 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; 

我在这个问题上摔了一跤,实现了上面接受的答案@ Kushan贡献的URL连接解决方​​案。 它在我的本地MySql实例中工作。 但是,当我将我的Pl​​ay / Scala应用程序部署到Heroku时,不再有效。 Heroku还将几个参数连接到它们提供给用户的数据库URL,而这个解决scheme由于Heroku使用“?”连接, 在他们自己的一套参数之前,将不会工作。 不过,我发现了一个不同的解决scheme似乎同样工作。

 SET sql_mode = 'NO_ZERO_DATE'; 

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

没有一年0000,也没有00或00的第00天。我build议你试试

 0001-01-01 00:00:00 

虽然在某些标准中已经定义了0年,但它比有用的恕我直言更容易混淆。

只是把这个字段作为字符

例如:铸(更新)为更新字符

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

在MySQL数据库中,将您的timestamp默认值更改为CURRENT_TIMESTAMP 。 如果您有假logging的旧logging,您将不得不手动修复它们。

如果没有必要,你可以从你的mysql表中删除“not null”属性。 当你删除“非空”属性不需要“0000-00-00 00:00:00”转换和问题消失。

至less为我工作。

我相信这是完全帮助谁在下面得到这个exception通过logstash抽取数据错误:logstash.inputs.jdbc – 执行JDBC查询时的exception{:exception =>#}

答:JDBC的:mysql://本地主机:3306 /数据库名称zeroDateTimeBehavior = convertToNull”

或者如果你正在使用MySQL