【问题标题】:Error is Sql syntax错误是 Sql 语法
【发布时间】:2012-10-16 06:23:56
【问题描述】:

我在以下代码 sn-p 中遇到 SQL 语法错误。这里有什么问题?我无法弄清楚。请帮忙。

String selectSQL = "SELECT * FROM cost_info where `date` > ? and `date` < ?  order by `date`";
        PreparedStatement preparedStatement = conn.prepareStatement(selectSQL);

        java.sql.Date sqlFromDate = java.sql.Date.valueOf(from_date);
        java.sql.Date sqlEndDate = java.sql.Date.valueOf(end_date);

        preparedStatement.setDate(1, sqlFromDate );
        preparedStatement.setDate(2, sqlEndDate );
        rs = preparedStatement.executeQuery(selectSQL);

我正在使用 MySQL。错误是:

com.mysql.jdbc.exceptions.jdbc4.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 '? and `date` < ?  order by `date`' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2569)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1521)
at com.source.viralmo.rms.CostDisplay.initialize(CostDisplay.java:77)
at com.source.viralmo.rms.CostDisplay.<init>(CostDisplay.java:34)
at com.source.viralmo.rms.AdminPage.actionPerformed(AdminPage.java:141)

【问题讨论】:

  • 你使用的是什么数据库,错误信息到底是什么意思?
  • 发布代码时,请将其突出显示并按{}。并使用预览查看您的帖子的外观。
  • 现在格式更好。请提出一些解决方案。显然,order by 子句只是这里的问题之一。你们还能想到什么??

标签: java mysql datetime jdbc prepared-statement


【解决方案1】:

首先,order by 应该在 where 之后。

其次,如果您使用的是 MySQL,则应引用 date,因为它是 DATE 类型的保留字。查询应该是:

SELECT * FROM cost_info where `date` > ? and `date` < ?  order by `date`

第三,prepared statements 使用executeQuery() 方法执行。这里使用的executeQuery(String) 方法用于执行普通语句;例如,它不会替换参数,因此 ? 会按原样传递给数据库。你需要:

rs = preparedStatement.executeQuery(/* empty */);

【讨论】:

  • 这似乎不是唯一的问题。
  • 是的,这确实是答案。在我的情况下尝试了所有方法:使用所有 PreparedStatement 设置方法更改 DATETIME、DATE 和 TIMESTAMP 之间的列类型。我几乎放弃了。看到您的答案,并将我巧妙命名的列“from”和“to”插入 MySQL Workbench 代码编辑器,并看到它们变为蓝色。哎呀。从。我希望mysql在这样的时刻能更像Captain Obvious。赞成。
【解决方案2】:
SELECT * FROM cost_info order by date where date > ? and date < ?

你把order by放在了错误的地方,它应该在查询的最后。

SELECT * FROM cost_info where date > ? and date < ?  order by date

【讨论】:

    【解决方案3】:

    Order by 子句位于 where 子句之后

    【讨论】:

      【解决方案4】:

      SELECT * FROM cost_info where date &gt; ? and date &lt; ? order by date 在您的情况下是正确的 sql

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-31
        • 2015-03-22
        • 2015-04-04
        • 2016-12-13
        相关资源
        最近更新 更多