“0000-00-00 00:00:00”不能被表示为的java.sql.Timestamp错误(&

2019-06-25 15:47发布

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

 (`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不改变表结构?

Answer 1:

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

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



Answer 2:

Whether or not the "date" '0000-00-00" is a valid "date" is irrelevant to the question. "Just change the database" is seldom a viable solution.

Facts:

  • MySQL allows a date with the value of zeros.
  • This "feature" enjoys widespread use with other languages.

So, if I "just change the database", thousands of lines of PHP code will break.

Java programmers need to accept the MySQL zero-date and they need to put a zero date back into the database, when other languages rely on this "feature".

A programmer connecting to MySQL needs to handle null and 0000-00-00 as well as valid dates. Changing 0000-00-00 to null is not a viable option, because then you can no longer determine if the date was expected to be 0000-00-00 for writing back to the database.

For 0000-00-00, I suggest checking the date value as a string, then changing it to ("y",1), or ("yyyy-MM-dd",0001-01-01), or into any invalid MySQL date (less than year 1000, iirc). MySQL has another "feature": low dates are automatically converted to 0000-00-00.

I realize my suggestion is a kludge. But so is MySQL's date handling. And two kludges don't make it right. The fact of the matter is, many programmers will have to handle MySQL zero-dates forever.



Answer 3:

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

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL


Answer 4:

追加下面的语句到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


Answer 5:

作为exteme周转,当你不能做一个ALTER你的日期列或更新的值,或在这些修改发生时,您可以使用的情况下/时做一个选择。

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;


Answer 6:

我斟酌着这个问题,并实现上文接受的答案贡献的@Kushan的URL拼接解决方案。 它的工作在我的本地MySQL实例。 但是,当我部署我的播放/斯卡拉应用的Heroku它不再是可行的。 Heroku上还串接几个参数传递给它们为用户提供DB URL,而这个解决方案,因为Heroku的使用串联的“?” 自己的一套参数的个数之前,将无法正常工作。 但是我发现了一个不同的解决方案,这似乎同样有效。

SET sql_mode = 'NO_ZERO_DATE';

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



Answer 7:

你可以尝试喜欢这个

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


Answer 8:

有没有0000年,没有00月00或一天,我建议你试试

0001-01-01 00:00:00

虽然一年0已经在一些标准定义,它更可能会比有用恕我直言混乱。



Answer 9:

只投领域为char

如:投(updatedate)为char作为updatedate



Answer 10:

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

在MySQL数据库,更改timestamp默认值到CURRENT_TIMESTAMP 。 如果你有旧记录与假的价值,你必须手动修复它们。



Answer 11:

如果没有必要,可以删除MySQL表从列“不空”属性。 当您删除“非空”属性不需要“0000-00-00 00:00:00”转换和问题走了。

至少为我工作。



Answer 12:

我相信这是帮助充满了对谁都是通过logstash错误得到这下面异常上抽数据:logstash.inputs.jdbc - 异常时执行JDBC查询{:异常=>#}

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

或者如果你正在使用MySQL



文章来源: '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error