Вопрос синтаксиса даты 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 при замене переменных в вашем запросе.