【问题标题】:how to fix error when inserting DATETIME into db将 DATETIME 插入数据库时​​如何修复错误
【发布时间】:2026-01-20 12:30:02
【问题描述】:

我正在尝试这样做:

pr.setStartdate("2006-09-10T00:00:00");

我收到此错误:

java.sql.SQLDataException: The syntax of the string representation of a datetime value is incorrect.

任何关于如何成功插入的想法都会很棒。

这里还有一些代码。 现在我需要设置日期吗?或者 setString 是否适用于开始时间、结束时间和日期?它们都是 DATETIME 对象:

PreparedStatement pstmt = conn.prepareStatement("UPDATE Event SET date=?, begintime=?, endtime=?, status=?, productionid=?, conceptual_packageid=? WHERE id=?");
        pstmt.setString(1, pkg.getDate());
        pstmt.setString(2, pkg.getBeginTime());
        pstmt.setString(3, pkg.getEndTime());
        pstmt.setString(4, pkg.getStatus());
        pstmt.setString(5, pkg.getProductionID());
        pstmt.setString(6, pkg.getConceptual_PackageID());
        pstmt.setString(7, pkg.getId());

        pstmt.executeUpdate();
        pstmt.close();

【问题讨论】:

  • 尝试在单引号中传递日期参数。
  • 我已经尝试过了,但我收到错误行说,“未封闭的字符文字,不是语句,';'预期。我在这里很困惑,看起来很简单
  • 什么是'pr'?我不认为这是一个准备好的陈述
  • pr 是我保存在数据库中的一个对象
  • 那么我们需要查看 pr 类的代码以及 jdbc 代码

标签: java sql derby


【解决方案1】:

我建议您使用 PreparedStatement 的 setTimestamp(...) 和 setDate(...) 方法,然后将实际的 Date 对象传递给它们,而不是使用字符串。如果您仅限于使用“pr”类中的字符串,则将字符串转换为derby doc 中指定的格式,然后使用以下代码

java.sql.Timestamp.valueOf("time/date converted");

【讨论】:

  • 因此:ps.setTimestamp(Timestamp.valueOf("2006-09-10 00:00:00"));
【解决方案2】:

据我所知,derby 没有“DATETIME”数据类型,它们支持 DATE、TIME 和 TIMESTAMP。

http://db.apache.org/derby/docs/10.10/ref/crefsqlj31068.html

因此,如果您希望在该字段中同时保留时间和日期值,我会确保您将“日期”列声明为 TIMESTAMP。

其次,我将单引号列名“日期”作为 DATE 是保留的数据类型。我不知道这是否是这里的问题,但可能想尝试一下。

第三,在设置/获取“日期”列时,我会尝试使用 set/getTimestamp 并在适用的情况下传递/分配 java.sql.Timestamp 对象。

希望能提供一些帮助。

【讨论】:

    【解决方案3】:

    日期、时间和时间戳不能 在表达中相互混合。 Derby 支持以下格式 对于时间戳:

    yyyy-mm-dd hh:mm:ss[.nnnnnn]
    yyyy-mm-dd-hh.mm.ss[.nnnnnn]

    年份必须始终为四位数。 月、日和小时可能有一个 或两位数。分和秒 必须有两位数。纳秒,如果 目前,可能有 1 到 6 个 数字。

    因此,您应该将“T”替换为空格或连字符。

    【讨论】:

      【解决方案4】:

      如果其他人遇到这个几个月前的问题(就像我一样)做类似但不相同的操作:仔细查看 Lev Khomich 回答中的两种格式:日/小时之间有一个空格,冒号之间小时/分钟,以及天/小时之间的破折号和小时/分钟之间的句点。我刚刚遇到了一个案例,使用了句点介于小时/分钟之间的 SQL 语句,其中天/小时之间的空格会导致错误,但破折号不会。

      我习惯了 DB2,它在使用小时/分钟和分钟/秒之间的句点时接受破折号或空格,这使得它更容易被忽略。我只是假设天/小时之间允许使用空格或破折号。

      【讨论】:

      • 我收到时间戳格式不正确的错误:您能告诉我哪里出了问题吗?这是我的 INSERT stt:INSERT INTO APP.MYTABLE VALUES ('2012-09-10 08:32:22[.1020]');
      • 我没有设置任何测试环境来测试这个,但我知道没有允许日期格式中的方括号的数据库。方括号在描述格式中是相当标准的符号,表明括号内的部分是可选的。但我认为您的问题很可能是括号实际上无法出现。只需取出 [ 和 ]。
      【解决方案5】:

      我遇到了同样的问题,然后我在这里找到了解决方案:

      http://apache-database.10148.n7.nabble.com/Date-Timestamp-format-for-inserts-td99979.html

      基本上你必须使用这种格式:

      yyyy-mm-dd-hh.mm.ss[.nnnnnn]
      

      例如,这个插入对我有用:

      statement.executeUpdate("INSERT INTO animal VALUES (1, 1, 'Elsa', '2006-09-10-00.00.00')");
      

      【讨论】:

        最近更新 更多