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

Cha*_*ake 138 java mysql timestamp jdbc

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

 (`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 
Run Code Online (Sandbox Code Playgroud)

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

...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......
Run Code Online (Sandbox Code Playgroud)

我尝试将空值传递给插入数据的日期,但它会分配给当前时间.

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

Kus*_*han 288

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

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

  • 好奇。阅读其他答案,answers,没有零月。这到底是什么意思? (2认同)
  • 你知道是否有一个等效的MariaDB附加到我的jdbc URL吗?jdbc:mariadb:// localhost:3306/dev?zeroDateTimeBehavior = convertToNull似乎对我不起作用. (2认同)

Unl*_*ity 15

"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零日期.


小智 8

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

?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Run Code Online (Sandbox Code Playgroud)

例如:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Run Code Online (Sandbox Code Playgroud)

  • 小心这种方法.它就像一个魅力,但它取消了我们的生产服务器(尽管在开发中工作得很好......).我们学到的是你需要引用字符串作为&在一些上下文中被解释为一个特殊字符,使该行具有完全不同的含义...... (4认同)

npe*_*npe 6

除了使用假日期等0000-00-00 00:00:000001-01-01 00:00:00(因为它是一个有效的日期,后者应该被接受),更改数据库架构,允许NULL值.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
Run Code Online (Sandbox Code Playgroud)


小智 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;
Run Code Online (Sandbox Code Playgroud)