Вопрос синтаксиса даты MySQL

Я новичок в базе данных MySql и в настоящее время сталкиваюсь с проблемой формата даты. Я пробовал несколько решений из Интернета, но ничего не получалось. Поэтому я выкладываю вопрос здесь.

У меня есть графический интерфейс, где я предоставляю дату в качестве ввода, которая находится в формате "мм / дд / гггг".

Это мой код, который содержит запрос:

  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

4 ответа

Решение

Во-первых, никогда не создавайте поля базы данных, как это были простые имена с пробелами (например, Edition Date) между словами это очень плохая практика, и это делает ее еще хуже при программировании. Это изображение, которое вы добавили в комментарии:

Я настоятельно рекомендую вам изменить это на что-то вроде 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 посмотрите здесь: Пример даты (второй запрос ничего не получает из-за формата)

В вашем коде вы форматируете дату, которая будет использоваться в запросе с этим кодом:

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

Ты используешь sd на ваш запрос, когда вы должны использовать sd1 так

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);

//...

Надеюсь, это прояснит вам.

Я думаю, что ваша проблема - пробелы в имени столбца, попробуйте что-то вроде `Дата выпуска` (или двойные кавычки)

Параметр даты должен быть в '' как строковые данные:

String query = "SELECT * FROM AP_Report, где Edition Date = '" + tempDate + "'";

Ваша проблема в том, что вам нужны кавычки вокруг даты в строке запроса. Использование кавычек, как показано ниже, и df1 должно работать.

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

Я также рекомендую изучать PreparedStatement при замене переменных в вашем запросе.

Другие вопросы по тегам