【问题标题】:I need help selecting within a MySQL DateTime range in Java我需要帮助在 Java 中的 MySQL DateTime 范围内进行选择
【发布时间】:2015-09-14 14:55:28
【问题描述】:

我的应用中有以下代码

String sql = "SELECT colA, colB, colC " + 
    "FROM " + tblName + " WHERE UserId = " + userId + 
    " AND InsertTimestamp BETWEEN " + lastDate + 
    " AND " + DataProcessor.TODAY + " ORDER BY UserId, Occurred";
try{
  if(null == conn)
    openDatabaseConnection();
  PreparedStatement stmt = conn.prepareStatement(sql);
  ResultSet rs = stmt.executeQuery();  <------- this is the line which throws the SQL exception
  retArray = this.getArrayListFromResultSet(rs);
}catch(SQLException sqle){
  JSONObject parms = new JSONObject();
  eh.processSQLException(methodName, sqle, sql, parms);
}

所以当我在调试器中运行我的应用程序时,我会收到此异常消息

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“00:00:00.0 AND 2014-08-20 00:00:00.0 ORDER BY UserId, Occurred”附近使用正确的语法

我有理由确定对此有简单合理的解决方案,但我一直没能找到。

我已尝试在 MySQL 手册中查找解决方案或其他格式。

我尝试通过 SQL 中的 TIMESTAMP() 函数和 DATE() 函数运行我的时间戳,但都没有帮助。

我从 Java 代码中提取了完整的 SQL,并在 MySQL Workbench 中运行它,没有任何问题,什么都没有。所以现在我正在向专家寻求帮助。

【问题讨论】:

  • 是的,我感觉到了。这不是最好的编码实践,如果这不是从调用方法传递特定且明确定义的参数的私有方法,那么你就死定了。

标签: java mysql datetime


【解决方案1】:

SQL 中的日期必须像字符串一样用单引号括起来。 当您使用准备好的语句时,为什么不使用“?”还有 stmt.setDate(...)?

String sql = "SELECT colA, colB, colC " + 
"FROM " + tblName + " WHERE UserId = ?" + 
" AND InsertTimestamp BETWEEN ?" + 
" AND ? ORDER BY UserId, Occurred";
try {
    if(null == conn) {
        openDatabaseConnection();
    }
    PreparedStatement stmt = conn.prepareStatement(sql);
    stmt.setInt(1, userId);
    stmt.setDate(2, lastDate);
    stmt.setDate(3, DataProcessor.TODAY);
    ResultSet rs = stmt.executeQuery();  
    retArray = this.getArrayListFromResultSet(rs);
} catch(SQLException sqle) {
    JSONObject parms = new JSONObject();
    eh.processSQLException(methodName, sqle, sql, parms);
}

无论如何,我认为您正在以相反的顺序设置日期。您应该首先输入“今天”,然后是 lastDate。虽然我不知道你的限制...

【讨论】:

  • stmt.setInteger(1, userId) 应该是stmt.setString(1, userId)(或stmt.setInt(1, userId))。
  • 是的,还是 setLong 什么的,我不记得语法了……改了!
  • 好的,无论如何,你需要用单引号将日期括起来,否则你会得到'语法错误'
  • 我未能在此代码中包含中断 - 因为 SQL 和参数的复杂性在一种方法中确定,然后传递给实际生成 PreparedStatement 然后执行的数据库访问对象方法 - 作为有几个数据库查询。因此,我在第一个方法中构建了整个查询并传递给调用的数据库访问对象方法。这可能有助于获得建议的解决方案,也可能没有帮助。随着时间的推移,我会更好地提出这些问题。
  • 我知道这是我应该做的,所以我只是试图按顺序传递参数,而不做大量的数据转换和操作,并允许通用 getResults( ) 方法来拉回值。我最终可能只是重写该方法和/或使其不那么通用。无论哪种方式,这是正确的方法,我只是想绕过它,这不是正确的做法。
猜你喜欢
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多