#java #sql
#java #sql
Вопрос:
Я впервые задаю здесь вопрос. Надеюсь, вы, ребята, сможете помочь. Я пытался выполнить функцию поиска в своем приложении, где, например, если я ищу 2016 год, все даты с 2016 годом будут отображаться в JTable из моей базы данных. Это мой текущий код, и он отображает только столбцы и никаких результатов в JTable:
String searchDate = dateTextField.getText();
String query = "select dateandtime,category,activity from history where dateandtime like '" searchDate "'";
Я попытался заменить ‘» searchDate «‘» на %’2016’%, и это сработало. Но мне нужно искать и другие годы, поэтому мне нужно будет выполнить запрос, используя текст из текстового поля. Как мне это сделать, чтобы я мог использовать строку, введенную в текстовое поле, для выполнения поиска и получения результатов.
Комментарии:
1. например, ‘%» searchDate «%'»
2. ВАУ! Большое вам спасибо, Винсент! Это сработало! Извините, я новичок в SQL, я пытался искать ответы, хотя мне потребовался целый день поиска, прежде чем спрашивать здесь. Спасибо за помощь 🙂
Ответ №1:
вы могли бы сделать это, добавив% до и после кавычек
String query = "select dateandtime,category,activity from history where dateandtime like '%" searchDate "%'";
Комментарии:
1. @DJTan: не использовать
LIKE
для дат или временных меток
Ответ №2:
LIKE
предназначен для строк, а не для дат.
Когда вы используете LIKE
для столбца TIMESTAMP
(или DATE
), база данных должна преобразовать это значение даты в строку — и у вас нет реального контроля над форматом даты, который используется для этого. Что еще хуже: это может работать по-разному в разных средах. Большинство СУБД выполняют это злонамеренное неявное преобразование типов данных на основе информации из клиентского приложения, а не на основе конфигурации сервера. Таким образом, вы можете получить разные результаты в зависимости от того, где выполняется код.
Вы не указали свою СУБД, но со стандартным SQL вы должны предпочесть что-то вроде этого:
where extract(year from dateandtime ) = 2016
или
where dateandtime >= date '2016-01-01'
and dateandtime < date '2016-01-01'
Преимущество второго оператора в том, что база данных может использовать индекс для этого столбца. Для первого потребуется специальный индекс, основанный на выражении.
Комментарии:
1. Спасибо за это. Я понял, что это создаст проблемы, если я запрошу дату, используя строку, поэтому вместо этого я изменил ее на Date:
Ответ №3:
Является ли столбец dateandtime типом ДАТЫ или метки ВРЕМЕНИ… почему вы запрашиваете его с помощью сравнения строк?
Смотрите Этот блог для получения длинного списка вредных привычек в запросах диапазона дат: