无法将“0000-00-00 00:00:00”转换为 TIMESTAMP

Posted

技术标签:

【中文标题】无法将“0000-00-00 00:00:00”转换为 TIMESTAMP【英文标题】:Cannot convert '0000-00-00 00:00:00' to TIMESTAMP 【发布时间】:2010-11-24 17:06:36 【问题描述】:

字段定义

 /** Date. */
  @Column(columnDefinition = "datetime")
  private Date date;

二传手

public void setDate(final Date date) 
    DateFormat dfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try 
      this.date = dfmt.parse(dfmt.format(date));
     catch (ParseException e) 
      // TODO Auto-generated catch block
      e.printStackTrace();
    

  

有人知道如何将“零日期”转换为正确的值吗? 因为我有错误:

Cannot convert value '0000-00-00 00:00:00' from column 13 to TIMESTAMP

即使我像这样设置“默认”字段和设置器:

/** Date. */
      @Column
      private Date date;


public void setDate(final Date date) 
      this.date = date;   
  

我还是会遇到同样的问题....

【问题讨论】:

在我看来 0000-00-00 00:00:00 并不对应于任何实际的时间点,因此它基本上不能转换为时间戳值。你想要的行为是什么?是否要将无效的 ISO 日期转换为默认值? 从表中获取数据(表中不止一列)后的下一步是将其写入 XML 但是(!)我不会将日期值写入 XML,所以我只是想从表中获取数据,然后我将永远不会调用 getDate() 方法。 "你想让它把无效的 ISO 日期转换成默认值吗?" - 是的,如果可能的话…… 【参考方案1】:

我将在这里大胆猜测您正在使用 mysql :-) 它使用“零日期”作为 special placeholder - 不幸的是,默认情况下 JDBC 无法处理它们。

解决方案是将“zeroDateTimeBehavior=convertToNull”指定为 MySQL 连接的参数(在数据源 URL 中或作为附加属性),例如:

jdbc:mysql://localhost/myDatabase?zeroDateTimeBehavior=convertToNull

这将导致所有这些值都被检索为 NULL。

【讨论】:

只是附注 - 这将在读取期间将零日期转换为空值,但在保存期间不会将空值转换为零。我还没有找到通过休眠将“0000-00-00”保存到数据库中的方法。 @serg555 - 你是对的。不过,我不得不问一下——为什么要将“0000-00-00”保存到数据库中? NULL 的存在正是出于这个原因,这整个“0000-00-00”可憎不过是痛苦。 出于同样的原因,我想读取零日期 - 系统就是这样设计的,我无法控制它。 @ChssPly76 非常感谢。【参考方案2】:

我不明白您的代码中的要点,您在其中格式化然后再次解析日期。这似乎是一个相同的操作。也许你可以详细说明?


如果你想给日期一个默认值,你可以这样做:

/** Jan 1, 1970 ; first moment in time in Java */
private static final Date NO_DATE = new Date(0L);

private Date date;

public void setDate(final Date date) 
     if (date == null) 
         this.date = NO_DATE;
      else 
         this.date = date;
     

注意:注解是可选的,这里我没有添加。

在此代码中,您可以将所需的内容替换为条件和默认值。

您还可以添加一个类似的设置器,它接受一个字符串参数,并检查您的特殊“00000...”值。这将允许使用日期或字符串设置字段。

【讨论】:

以上是关于无法将“0000-00-00 00:00:00”转换为 TIMESTAMP的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 日期时间转换为 0000-00-00 00:00:00 到 MySQL

MySql5.7 datetime 默认值为‘0000-00-00 00:00:00'值无法创建问题解决

MySQL Workbench - 表数据导入向导将所有日期时间对象写入 0000-00-00 00:00:00

报错 java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Tim

如何在java中处理具有值“0000-00-00 00:00:00”的日期[重复]

Incorrect datetime value: '0000-00-00 00:00:00' for column 'addtime' at row问题解决(示例代码