错误是 Sql 语法
Posted
技术标签:
【中文标题】错误是 Sql 语法【英文标题】:Error is Sql syntax 【发布时间】: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 子句只是这里的问题之一。你们还能想到什么??
【参考方案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 > ? and date < ? order by date
在您的情况下是正确的 sql
【讨论】:
以上是关于错误是 Sql 语法的主要内容,如果未能解决你的问题,请参考以下文章