“0000-00-0000: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

132078 次浏览

没有千年,也没有00或00天,我建议你试试

0001-01-01 00:00:00

虽然在某些标准中已经定义了0年,但在我看来,0年更有可能是令人困惑的,而不是有用的。

不要使用像 0000-00-00 00:00:000001-01-01 00:00:00这样的假日期(后者应该被接受,因为它是一个有效的日期) ,而是更改数据库模式,以允许 NULL值。

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

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

Mysql://yourserver: 3306/yourdatabase? zeroDateTimeBehavior = ConvertToNull

我努力解决这个问题,并实现了@Kushan 提供的 URL 连接解决方案。它在我的本地 MySql 实例中工作。但当我把 Play/Scala 应用程序部署到 Heroku 时,它已经不能工作了。Heroku 还将几个参数连接到它们提供给用户的 DB URL,这个解决方案是因为 Heroku 使用了“ ?”在自己的一套参数之前,不会工作。然而,我发现了一个不同的解决方案,似乎同样有效。

SET sql_mode = 'NO_ZERO_DATE';

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

“日期”“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 的日期处理也是。 两个拼图不能解决问题。事实上,许多程序员将不得不处理 MySQL 的零日期 永远

在 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

作为一个极端的转变,当您无法更改您的日期列或更新值时,或者当这些修改发生时,您可以使用 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;

只要将场投射为 char

例如: cast (update) as char as update

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

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

我相信这是谁得到这下面例外泵数据通过 logstash 的帮助充分 错误: logstash.inputs.JDBC-执行 JDBC 查询时发生异常{ : eption = > # }

答案: jdbc: mysql://localhost: 3306/database _ name? zeroDateTimeBehavior = ConvertToNull”

或者如果您正在使用 mysql

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

至少对我有用。

你可以试试这样

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);
}