【问题标题】:mysql date syntax issuemysql日期语法问题
【发布时间】:2015-04-07 23:53:04
【问题描述】:

我是 MySql 数据库的新手,目前面临日期格式的问题。我从互联网上尝试了一些解决方案,但没有任何效果。因此,我在这里发布问题。

我有一个 GUI,我在其中提供日期作为输入,格式为“mm/dd/yyyy”。

这是我的包含查询的代码:

  public boolean fetchAPReportDomino(Date edDate, APReport apReport ){
    Statement stmt=null;
    ResultSet rs=null;
    SimpleDateFormat sd= new SimpleDateFormat("MM/dd/yyyy");
    SimpleDateFormat sd1=new SimpleDateFormat("yyyy-MM-dd");
    String tempDate=sd.format(edDate);
    if(getConnection()!=null){

            try {
                stmt= getConnection().createStatement();

               String query="SELECT * FROM AP_Report where Edition Date = " + tempDate;
               rs = stmt.executeQuery(query);
               while (rs.next()) {
                   apReport.setRoomHumidity(rs.getInt("Room Humidity"));
                   apReport.setRoomTemperature(rs.getInt("Room Temperature"));
               }
               rs.close();
               stmt.close();

            } catch (SQLException ex) {
                Logger.getLogger(DataService.class.getName()).log(Level.SEVERE, null, ex);
                return false;
            }
    }
    return true;
}

在 MySql 工作台中,我尝试将日期字段更改为“DATE”、“TIMESTAMP”、“DATETIME”数据类型。但没有任何帮助。

以下是我执行代码时看到的错误:

SEVERE: 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 'Date = 02/14/2015' at line 1

下面的表结构截图:

http://prntscr.com/6qz5my

【问题讨论】:

  • 了解prepared statements,并将Date作为java.sql.Date类型的参数传递。不是通过连接字符串:docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
  • 另外,你在数据库中的日期字段不能是Edition Date(带空格),除非它是用反引号创建的,所以你必须使用它!
  • 能否提供表结构?
  • 粘贴表格结构的屏幕:prntscr.com/6qz5my

标签: java mysql date


【解决方案1】:

首先永远不要创建数据库字段,就像在单词之间使用空格(例如 Edition Date)那样创建数据库字段,这是一种非常糟糕的做法,它会导致在编程时使用它甚至更糟。 这是您在 cmets 中添加的图像:

我强烈建议您将其更改为 edition_date。数据库字段不需要非常容易理解。

第二 因为您创建了这样的字段,所以您必须在使用该字段在数据库上运行的所有查询中使用 backtics `,否则 sql 解析器不知道如何识别有一个像Edition Date这样的名字

您看到的错误:

...server version for the right syntax to use near 'Date = 02/14/2015' at line 1

准确说明我所说的关于它向您显示的字段名称 'Date = 02/14/2015' 因为 sql 解析器认为 Edition 单词是命令或运算符,因此它无法识别其余部分。

在您创建的查询上使用它的正确方法是这样的:

String query="SELECT * FROM AP_Report where `Edition Date` = " + tempDate;

看到反引号了吗?

但是这种方式仍然是错误的,因为您的查询是一个没有准备好的语句的字符串,这意味着您必须用单引号将您的值 tempDate 括起来,所以正确的方式是:

String query="SELECT * FROM AP_Report where `Edition Date` = '" + tempDate + "'";

但还是有问题,比较为字符串的默认mysql日期格式是yyyy-MM-dd在这里看到它:Date Example(第二个查询因为格式什么都没有)

在您的代码中,您正在使用此代码格式化要在查询中使用的日期:

SimpleDateFormat sd= new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat sd1=new SimpleDateFormat("yyyy-MM-dd");
String tempDate=sd.format(edDate);

当您应该使用 sd1 时,您在查询中使用 sd 所以

String tempDate=sd1.format(edDate);

之后,您可以将查询用作:

String query="SELECT * FROM AP_Report where `Edition Date` = '" + tempDate + "'";

注意:我不记得在apReport.setRoomHumidity(rs.getInt("Room Humidity")); 此处检索值时是否必须使用反引号,因此如果第一种方法不起作用,则应使用apReport.setRoomHumidity(rs.getInt("`Room Humidity`")); 进行测试。

为了了解知识,您应该考虑使用准备好的语句,在您的代码中将类似于:

//...

String query="SELECT * FROM AP_Report where `Edition Date` = ?"
PreparedStatement pstmt = getConnection().prepareStatement(query);

//note that depending on your date type you will need just one 
//of the lines below

//if your edDate is a java.util.Date use as:
pstmt.setDate(new java.sql.Date(edDate.getTime()));
//if it is already a java.sql.Date
pstmt.setDate(edDate);

rs = pstmt.executeQuery(query);

//...

希望它能为您解决问题。

【讨论】:

    【解决方案2】:

    我认为您的问题是列名中的空格, 尝试类似“版本日期”(或双引号)

    【讨论】:

      【解决方案3】:

      您的问题是您需要在查询字符串中的日期周围加上引号。使用如下引号和 df1 应该可以。

      String query="SELECT * FROM AP_Report where Edition Date = '" + tempDate + "'";
      

      我还建议在将变量替换到查询中时查看 PreparedStatement。

      【讨论】:

      • 这个答案是错误的,因为错误细节说明了他试图查询的字段 Date 应该是带有 backtics 的 `Edition Date`
      【解决方案4】:

      日期参数必须像字符串数据一样在''中:

      String query="SELECT * FROM AP_Report where Edition Date = '" + tempDate + "'";

      【讨论】:

      • 这个答案是错误的,因为错误细节说明了他试图查询的字段 Date 应该是 `Edition Date` 和 backtics
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2010-09-28
      • 2011-07-10
      • 2012-05-02
      • 2010-10-18
      • 2015-11-13
      • 2011-04-01
      相关资源
      最近更新 更多