SQL-запрос для поиска значения строки по частичной строке значения строки

#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 типом ДАТЫ или метки ВРЕМЕНИ… почему вы запрашиваете его с помощью сравнения строк?

Смотрите Этот блог для получения длинного списка вредных привычек в запросах диапазона дат: