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

问题

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

(`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而无需更改表结构

提前致谢


#1 热门回答(249 赞)

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

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


#2 热门回答(10 赞)

"date"'0000-00-00"是否是有效的"日期"与问题无关。"只是改变数据库"很少是一个可行的解决方案。

事实:

  • MySQL允许日期值为零。
  • 此"功能"广泛用于其他语言。

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

Java程序员需要接受MySQL零日期,并且当其他语言依赖于这个"特性"时,他们需要将零日期重新放回数据库。

连接MySQL的程序员需要处理null和0000-00-00以及有效日期。将0000-00-00变为null并不是一个可行的选择,因为那样你就不能再确定日期是否应该是用于写回数据库的。

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

我意识到我的建议是一个kludge。但MySQL的日期处理也是如此。并且两个kludges没有做对。事实是,许多程序员必须处理MySQL零日期。


#3 热门回答(7 赞)

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

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL