【问题标题】:'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error'0000-00-00 00:00:00' 不能表示为 java.sql.Timestamp 错误
【发布时间】:2012-06-23 10:16:19
【问题描述】:

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

 (`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

【问题讨论】:

    标签: java mysql jdbc timestamp


    【解决方案1】:

    没有0000年,也没有00月00日。建议你试试

    0001-01-01 00:00:00
    

    虽然在某些标准中定义了第 0 年,但它比有用的恕我直言更容易造成混淆。

    【讨论】:

    • 是的,有 0000 年。事实上它是 0 年,我们有 -1 年和 -1000 年。从未见过这个Gregorian calendar 或这个Anno Domini 和更多特别是公历没有零年,但iso 有并且iso 用于bij 计算机见0 year
    • @sirwilliam 感谢您提供有趣的资格。看来 OP 希望将第 0 年视为 NULL 或不存在的东西。
    • 在 MySQL 中 0000-00-00 00:00:00 等于 0。在遗留代码中可能有一些依赖于此的查询。
    【解决方案2】:

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

    ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 很好奇。阅读其他答案,呃,没有零月。这到底是什么意思?
      • 你知道是否有一个 MariaDB 等价于附加到我的 jdbc URL? jdbc:mariadb://localhost:3306/dev?zeroDateTimeBehavior=convertToNull 似乎对我不起作用。
      • 对我来说必须是 CONVERT_TO_NULL
      【解决方案4】:

      我解决了这个问题,并在上​​面接受的答案中实现了@Kushan 提供的 URL 连接解决方​​案。它在我本地的 MySql 实例中工作。但是当我将我的 Play/Scala 应用程序部署到 Heroku 时,它就不再工作了。 Heroku 还将几个 args 连接到他们提供给用户的 DB URL,以及这个解决方案,因为 Heroku 使用连接“?”之前自己设置的args,是行不通的。但是我发现了一个不同的解决方案,它似乎同样有效。

      SET sql_mode = 'NO_ZERO_DATE';
      

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

      【讨论】:

        【解决方案5】:

        “日期”“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 的日期处理也是如此。 两个kludges并没有使它正确。事实上,许多程序员将不得不永远处理 MySQL 零日期。

        【讨论】:

          【解决方案6】:

          将以下语句附加到 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
          

          【讨论】:

          • 小心这种方法。它就像一个魅力,但它在我们身上取下了一个生产服务器(虽然在开发中完美地工作......)。我们了解到,您需要引用字符串,因为 & 在某些情况下被解释为特殊字符,从而使该行具有完全不同的含义...
          【解决方案7】:

          作为一种极端的转变,当您无法更改日期列或更新值时,或者在进行这些修改时,您可以使用大小写/时间进行选择。

          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;
          

          【讨论】:

            【解决方案8】:

            只需将字段转换为字符

            例如:cast(updatedate) as char as updatedate

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

              • 这也无济于事。
              【解决方案10】:

              我相信这对于在通过 logstash 抽取数据的例外情况下获得此信息的人来说是完全有帮助的 错误:logstash.inputs.jdbc - 执行 JDBC 查询时出现异常 {:exception=>#}

              答案:jdbc:mysql://localhost:3306/database_name?zeroDateTimeBehavior=convertToNull"

              或者如果你正在使用 mysql

              【讨论】:

                【解决方案11】:

                如果没有必要,您可以从 mysql 表中的列中删除“not null”属性。当您删除“not null”属性时,不需要“0000-00-00 00:00:00”转换,问题就消失了。

                至少对我有用。

                【讨论】:

                  【解决方案12】:

                  你可以这样试试

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

                  【讨论】:

                    猜你喜欢
                    • 2018-02-15
                    • 1970-01-01
                    • 2013-06-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-24
                    • 1970-01-01
                    • 2011-06-27
                    相关资源
                    最近更新 更多