【问题标题】:JDBC date to SQL dateJDBC 日期到 SQL 日期
【发布时间】:2016-11-02 06:07:10
【问题描述】:

我一直在使用 Java 来存储 csv 文件中的一些记录。 这些记录之一是日期。这里的问题是我使用 JDBC 将这些记录存储在数据库中。现在,Java 的 Date 对象在将其放入数据库时​​显示错误。我已经坚持了一段时间。请让我知道如何解决这个问题。我在 mysql 中使用 Date 类型将其存储到数据库中。这是造成问题的部分。

DateFormat d1 = new SimpleDateFormat("yyyy-MM-dd");
Date d = new Date(); 
System.out.println(d1.format(d));
String sql = "INSERT INTO TESTING"+
            "VALUES("+"DATE_FORMAT("+d+","+"'%Y-%m-%d'"+"))";
stmt.executeUpdate(sql);

如果我直接在 MySqlWorkBench 中执行此操作,它将正确存储日期。但是通过JDBC这是一个问题。

错误如下图:

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Jun 30 14:04:03 IST 2016,'%Y-%m-%d'))' at line 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
    at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1402)
    at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317)
    at payex.writeDB(payex.java:221)
    at payextestdrive.main(payextestdrive.java:11)

【问题讨论】:

  • “现在,Java 的 Date 对象在将其放入数据库时​​显示错误” - 什么错误?在这里使用字符串连接不是正确的解决方案...您绝对应该使用 PreparedStatement,但您需要使用java.sql.Date,而不是java.util.Date
  • 你也可以参考这个帖子stackoverflow.com/questions/2305973/…
  • "INSERT INTO TESTING"+"VALUES... 无法工作
  • 您应该真正使用 PreparedStatement 和带有参数占位符的查询,而不是将值连接到查询字符串中。

标签: java mysql sql-server jdbc


【解决方案1】:

当您想要添加格式化的日期字符串时,您将d.toString() 添加到 SQL 命令。表名和VALUES之间也少了一个空格:

String sql = "INSERT INTO TESTING VALUES(DATE_FORMAT(" + d1.format(d) +",'%Y-%m-%d'))";

【讨论】:

  • 嘿,我试过了。感谢您的回答。但是又有一个例外。
  • com.mysql.jdbc.MysqlDataTruncation:数据截断:不正确的日期时间值:com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2983) 处 com.mysql.jdbc 处的“2008”。 MysqlIO.sendCommand(MysqlIO.java:1631) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) 在 com.mysql.jdbc.Connection.execSQL(Connection.java:3277) 在 com.mysql.jdbc .Statement.executeUpdate(Statement.java:1402) 在 com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317) 在 payex.writeDB(payex.java:220) 在 payextestdrive.main(payextestdrive.java:11)
【解决方案2】:

错误信息很清楚

right syntax to use near 'Jun 30 14:04:03 IST 2016,'%Y-%m-%d'))'

您提供的格式是 MMM DD HH:mm:ss Z YYYY,但系统需要 %Y-%m-%d

试试

DateFormat d1 = new SimpleDateFormat("yyyy-MM-dd");
Date d = new Date(); 
System.out.println(d1.format(d));
String sql = "INSERT INTO TESTING"+
            " VALUES("+"DATE_FORMAT('"+d1.format(d)+"',"+"'%Y-%m-%d'"+"))";
stmt.executeUpdate(sql);

或者干脆

DateFormat d1 = new SimpleDateFormat("yyyy-MM-dd");
Date d = new Date(); 
System.out.println(d1.format(d));
String sql = "INSERT INTO TESTING"+
            " VALUES('"+d1.format(d)+"')";
stmt.executeUpdate(sql);

【讨论】:

  • 您好,感谢您的回答。我试过了,但我遇到了一个例外。
  • com.mysql.jdbc.MysqlDataTruncation:数据截断:不正确的日期时间值:com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2983) 处 com.mysql.jdbc 处的“2008”。 MysqlIO.sendCommand(MysqlIO.java:1631) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) 在 com.mysql.jdbc.Connection.execSQL(Connection.java:3277) 在 com.mysql.jdbc .Statement.executeUpdate(Statement.java:1402) 在 com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317) 在 payex.writeDB(payex.java:221) 在 payextestdrive.main(payextestdrive.java:11)
猜你喜欢
  • 2016-08-08
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多